;+ ; NAME: ; doy2md ; ; ; PURPOSE: ; convert a day of year to a month day ; ; ; CATEGORY: ; time conversion ; ; ; INPUTS: ; doy: the day of year (is chopped to an int) ; may be an array ; year: for Pete's sake use 4-digit ; an arry if dirrent years or can be a scalar for all ; ; OUTPUTS: ; [month, day], (1 = January, ..., 12 = December) ; (days from 1-31) ; ; ; ; RESTRICTIONS: ; no restrictions that I know of, could probably get rid of recursive for loop ; for something better ; ; ; EXAMPLE: ; ; IDL> print, doy2md(123, 2000) ; 5 2 ; IDL> print, doy2md([123,122,121, 120], 2000) ; 5 5 4 4 ; 2 1 30 29 ; IDL> print, doy2md([123,122,121, 120], 2001) ; 5 5 5 4 ; 3 2 1 30 ; ; ; MODIFICATION HISTORY: ; ; Thu Jan 24 13:38:24 2008, Brian Larsen ; got rid of recursive call to speed up, still cant et ; rid of the for loop, but got a x3 speed increase ; ; Wed Feb 7 12:03:16 2007, Brian Larsen ; written and tested ; ;- FUNCTION doy2md, doy, year compile_opt strictarr n_doy = n_elements(doy) IF N_ELEMENTS(year) NE 1 AND N_ELEMENTS(year) NE n_doy THEN $ message, /ioerror, 'Must input year' IF N_ELEMENTS(year) EQ 1 THEN year = replicate(year, n_doy ) mask = doy GE 367 OR doy LT 0 IF (total(mask) GT 0) THEN $ message, /ioerror, 'Invalid day of year [0-366]' leap = leap_year(year) ; J F M A M J J A S O N D mon_arr = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] ;; i cant figure out how to get rid of this for loop.... mon = intarr(n_doy) day = intarr(n_doy) FOR i=0l, n_doy-1 DO BEGIN IF leap[i] EQ 1 THEN mon_arr[1] = 29 ELSE mon_arr[1] = 28 ; add one to february ind = min(where(doy[i]-1 LT total(mon_arr, /cumulative) )) mon[i] = ind+1 ; jan is month 1 day[i] = mon_arr[ind] - (total(mon_arr[0:ind]) - doy[i]) ENDFOR RETURN, [[mon], [day]] END