time array에서 데이터 nan 채우기

게시판 IDL Q&A time array에서 데이터 nan 채우기

2 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #5620 Reply
      S.H.Ahn
      회원

      안녕하세요.
      time series 데이터에서 gap을 nan 값으로 채우려고 합니다.

      제가 갖고있는 데이터는 년, 월, 일, 시간, 분(5분 간격), value1, value2 대략 이 형식이고요.
      timegen으로 원하는 기간 설정해주고 갖고있는 데이터를 for와 if문으로 일치시켜서 해당 데이터가 있으면 입력, 없으면 nan으로 생성되게 작성하였습니다.
      문제는 데이터 기간이 5년이나 되어서 시간이 너무 많이 소요되서요.
      혹시 다른 방법을 아시는 분은 조언좀 부탁드립니다.

      이해에 도움이 되실 것 같아 코드첨부합니다.
      (읽어드린 자료는 yy,mm,dd,hh,minu,var1,var2 입니다.)

      ;***********************************************************************************************
      MyDates = TIMEGEN(START=JULDAY(1,1,2014,0,0), FINAL=JULDAY(1,1,2019,0,0), step_size=5, UNITS=’Minute’) ;JULDAY(Month, Day, Year, Hour, Minute, Second)
      caldat, Mydates, Mo, D, Y, H, M
      legnth = n_elements(Y)
      ;***********************************************************************************************
      data = fltarr(legnth,2)
      data[*,*] = nan

      FOR i = 0l, legnth -1 DO BEGIN
      FOR j = 0l, n_elements(yy)-1 DO BEGIN
      IF (long(Y[i]) EQ long(yy[j])) and (long(Mo[i]) EQ long(mm[j]))and (long(D[i]) EQ long(dd[j])) and (long(H[i]) EQ long(hh[j])) and (long(M[i]) EQ long(minu[j])) THEN BEGIN
      data[i,0] = var1[j]
      data[i,1] = var2[j]
      ENDIF
      ENDFOR
      ENDFOR

      openw,lun,opath+’output.dat’,/get_lun, /append
      For i = 0l, n_elements(mydates)-1 do begin
      printf, lun,Y[i], Mo[i], D[i],H[i],M[i], data[i,0:1], format='(5i8,2f15.7)’
      ENDFOR
      close,lun
      free_lun, lun

      END

    • #5621 Reply
      ChoiYoun
      회원

      성능향상을 위해 이중반복문과 다중조건문을 제거하였습니다.

      1)이중반복문 제거: yy-mm-dd hh:minu 정보를 JULDAY를 이용해 배열형태로 변경(DataDates)
      2)다중조건문 제거: WHERE을 사용해 다중조건문 제거

      아래 코드를 참조하시면 되겠습니다.

      DataDates = JULDAY(dd,mm,yy,hh,minu)
      FOR i = 0l, n_elements(yy)-1 DO BEGIN
      wh = WHERE(MyDates EQ DataDates[i], /L64)
      IF SIZE(wh, /DIMENSIONS) EQ 1 THEN BEGIN
      data[wh,0] = var1[i]
      data[wh,1] = var2[i]
      ENDIF
      ENDFOR

    • #5622 Reply
      S.H.Ahn
      회원

      DataDates = JULDAY(mm,dd,yy,hh,minu)로 바꾸고 하니 잘 되네요.
      덕분에 프로그램 빠르게 돌렸습니다.

      감사합니다!! 😀

2 답변 글타래를 보이고 있습니다
'time array에서 데이터 nan 채우기'에 답변달기
글쓴이 정보: