- This topic has 2개 답변, 2명 참여, and was last updated 4 years, 10 months 전에 by S.H.Ahn.
-
글쓴이글
-
-
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[*,*] = nanFOR 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
ENDFORopenw,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, lunEND
-
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 -
S.H.Ahn회원
DataDates = JULDAY(mm,dd,yy,hh,minu)로 바꾸고 하니 잘 되네요.
덕분에 프로그램 빠르게 돌렸습니다.감사합니다!! 😀
-
-
글쓴이글