;************************************************************************* ; D. Shea ; ; given, say, 1979071906 where 0719 is the 200th day of the year ; yrFrac = yyyymmddhh2yyyyFrac (1979071906) ; yrFrac = 1979.5458984375 ([200-1]*86400.+hh*3600.)/(86400*365) ; ; yyyymmddhh - scalar or array of dates ; ; assumes Gregorian calendar undef ("yyyymmddhh2yyyyFrac") function yyyymmddhh2yyyyFrac (yyyymmddhh[*]:numeric) local year, mmddhh, mon, ddhh, day, hour, dayYear, nTim, yrFrac \ , n, ysec, dsec, varType, YEAR begin varType = typeof(yyyymmddhh) if (varType.eq."integer") then YYYYMMDDHH = yyyymmddhh else YYYYMMDDHH = toint(yyyymmddhh) end if year = YYYYMMDDHH/1000000 mmddhh = YYYYMMDDHH-year*1000000 delete(YYYYMMDDHH) mon = mmddhh/10000 ddhh = mmddhh-mon*10000 delete (mmddhh) day = ddhh/100 hour = ddhh-day*100 delete (ddhh) if (isatt(yyyymmddhh,"calendar")) then year@calendar = yyyymmddhh@calendar ; check for calendar end if dayYear = day_of_year(year, mon, day) ; Gregorian calendar delete ([/mon, day/]) nTim = dimsizes(yyyymmddhh) if (varType.eq."double") then yrFrac = new( nTim, "double", "No_FillValue") one = 1d0 else yrFrac = new( nTim, "float", "No_FillValue") one = 1.0 end if if (isatt(yyyymmddhh,"calendar")) then ; retrofit to existing code yrFrac@calendar = yyyymmddhh@calendar if (yyyymmddhh@calendar.eq."360_day" .or. yyyymmddhh@calendar.eq."360") then con = (/ 360, 360, 86400, 3600 /)*one end if if (yyyymmddhh@calendar.eq."365_day" .or. yyyymmddhh@calendar.eq."365" .or. \ yyyymmddhh@calendar.eq."noleap" .or. yyyymmddhh@calendar.eq."no_leap") then con = (/ 365, 365, 86400, 3600 /)*one end if if (yyyymmddhh@calendar.eq."366_day" .or. yyyymmddhh@calendar.eq."366" .or. \ yyyymmddhh@calendar.eq."allleap" .or. yyyymmddhh@calendar.eq."all_leap") then con = (/ 366, 366, 86400, 3600 /)*one end if if (yyyymmddhh@calendar.eq."gregorian" .or. yyyymmddhh@calendar.eq."standard") then con = (/ 365, 366, 86400, 3600 /)*one end if else con = (/ 365, 366, 86400, 3600 /)*one ; default is gregorian/standard end if do n=0,nTim-1 if (isleapyear(year(n))) then ysec = con(2)*con(1) else ysec = con(2)*con(0) end if dsec = (dayYear(n)-1)*con(2) + hour(n)*con(3) yrFrac(n) = year(n) + dsec/ysec end do yrFrac@long_name = "Time" yrFrac@units = "YYYY + fractional portion of year" yrFrac@NCL = "contributed.ncl: function yyyymmddhh_to_yyyyFrac" return(yrFrac) end ;************************************************************************* ; D. Shea ; a function that invokes yyyymmddhh2yyyyFrac ; name consistent with yyyymm_to_yyyyfrac ; name consistent with yyyymmdd_to_yyyyfrac ; ; ignore hhOffset ; undef("yyyymmddhh_to_yyyyfrac") function yyyymmddhh_to_yyyyfrac (yyyymmddhh:numeric, hhOffset[1]:numeric) local varType begin varType = typeof(yyyymmddhh) if (varType.eq."integer" .or. \ varType.eq."float" .or. \ varType.eq."double" ) then return (yyyymmddhh2yyyyFrac (yyyymmddhh)) else print("yyyymmddhh_to_yyyyfrac: variable type="+varType+" not supported") exit end if end