time array에서 데이터 nan 채우기

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

이 게시글은 2개 답변과 2명 참여가 있으며 마지막으로  S.H.Ahn에 의해 2 월, 3 주 전에 업데이트 됐습니다.

  • 글쓴이
  • #5620 답변

    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 답변

    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 답변

    S.H.Ahn
    회원

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

    감사합니다!! 😀

'time array에서 데이터 nan 채우기'에 답변달기
글쓴이 정보: