[ncl-talk] convert the time proleptic gregorian calendar to UTC date in NCL

Dave Allured - NOAA Affiliate dave.allured at noaa.gov
Thu Dec 17 15:47:10 MST 2020


The results look like this.  I do not show the individual year, month day
arrays, but they are in there if you need them.  Is this what you are
looking for?

Variable: time2
Type: double
Total Size: 64 bytes
            8 values
Number of Dimensions: 1
Dimensions and sizes: [8]
Coordinates:
Number Of Attributes: 2
  calendar : gregorian
  units : days since 1850-1-1
(0) 30.99444444105029
(1) 58.99444444105029
(2) 56551.99444444105
(3) 56581.99444444105
(4) 56612.99444444105
(5) 56643.99444444105
(6) 56946.99444444105
(7) 56977.99444444105
(0)
(0) 1850-01-31 23:51:59
(1) 1850-02-28 23:51:59
(2) 2004-10-31 23:51:59
(3) 2004-11-30 23:51:59
(4) 2004-12-31 23:51:59
(5) 2005-01-31 23:51:59
(6) 2005-11-30 23:51:59
(7) 2005-12-31 23:51:59


On Thu, Dec 17, 2020 at 2:57 PM Dave Allured - NOAA Affiliate <
dave.allured at noaa.gov> wrote:

> Your input time format is valid, but it is non-standard, so it must be
> converted with code.  Function *cd_calendar* does not understand this
> format.  Here is some code that creates two different formats, depending on
> what you want to do next.  One format is year, month, day in separate
> arrays.  The other is standard relative time offsets, like you would read
> in from a CF conforming Netcdf data set.
>
> Note that proleptic_gregorian is exactly the same as normal Gregorian
> calendar in this time range.
>
> Thanks to Dennis Shea for assisting with this reply.
>
> load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/cd_string.ncl"
> begin
>
> ; This part simulates the original input data, for demo only.
> ; It should be deleted and replaced with the original input code.
> ; This is a non-standard format, decimal coded integers plus fraction of
> day.
>
>   time = (/18500131.99444444d0, 18500228.99444444d0  \
>           ,20041031.99444444d0, 20041130.99444444d0  \
>           ,20041231.99444444d0, 20050131.99444444d0  \
>           ,20051130.99444444d0, 20051231.99444444d0 /)
>   time!0 = "time"
>   time at units = "day as %Y%m%d.%f"       ; udunits does not understand this
>   time at calendar = "proleptic_gregorian"
>
> ; This part converts the decimal coded dates to year, month, day arrays.
>
>   YYYY = toint(time/10000)
>   MMDD = toint(time-YYYY*10000)
>   MM   = MMDD/100
>   DD   = MMDD-MM*100
>   frac = time-toint(time)        ; this is fraction of day, 0.0 to 1.0
>
> ; Now convert the year, month, day arrays to CF standard relative times.
>
>   H    = DD       ; dummy time of day arrays = 00:00:00, will be replaced
>   H    = 0
>   M    = H
>   S    = H
>
>   units2       = "days since 1850-1-1"
>   opt          = 0
>   opt at calendar = "gregorian"
>
>   time2 = cd_inv_calendar (YYYY, MM, DD, H, M, S, units2, opt)
>   time2 = time2 + frac    ; add fraction of day back in, no conversion
> needed
>   print (time2)
>
> ; Decode final result, and display.
>
>   print ("")
>   strings = cd_string (time2, "%Y-%N-%D %H:%M:%S")
>   print (strings+"")
> end
>
>
> On Thu, Dec 17, 2020 at 6:15 AM Sri nandini via ncl-talk <
> ncl-talk at mailman.ucar.edu> wrote:
>
>> Hello dear ncl-users
>>
>> I am trying to convert the time proleptic_gregorian calendar in the time
>> format of my data to UTC date, so that irs easier to extract the years
>> to work with.
>>
>> The original print time output is this:
>>
>> Variable: time
>> Type: double
>> Total Size: 14976 bytes
>>              1872 values
>> Number of Dimensions: 1
>> Dimensions and sizes:    [time | 1872]
>> Coordinates:
>>              time: [18500131.99444444..20051231.99444444]
>> Number Of Attributes: 4
>>    standard_name :    time
>>    units :    day as %Y%m%d.%f
>>    calendar :    proleptic_gregorian
>>    axis :    T
>> (0)    18500131.99444444
>> (1)    18500228.99444444
>> (2)    18500331.99444444
>> (3)    18500430.99444444
>> (4)    18500531.99444444
>> (5)    18500630.99444444
>> (6)    18500731.99444444
>> (7)    18500831.99444444
>> (8)    18500930.99444444
>> (9)    18501031.99444444
>> (10)    18501130.99444444
>> (11)    18501231.99444444
>> (12)    18510131.99444444
>> (13)    18510228.99444444
>> (14)    18510331.99444444
>> (15)    18510430.99444444
>> (16)    18510531.99444444
>> (17)    18510630.99444444
>> ................continued
>>
>> (1852)    20040531.99444444
>> (1853)    20040630.99444444
>> (1854)    20040731.99444444
>> (1855)    20040831.99444444
>> (1856)    20040930.99444444
>> (1857)    20041031.99444444
>> (1858)    20041130.99444444
>> (1859)    20041231.99444444
>> (1860)    20050131.99444444
>> (1861)    20050228.99444444
>> (1862)    20050331.99444444
>> (1863)    20050430.99444444
>> (1864)    20050531.99444444
>> (1865)    20050630.99444444
>> (1866)    20050731.99444444
>> (1867)    20050831.99444444
>> (1868)    20050930.99444444
>> (1869)    20051031.99444444
>> (1870)    20051130.99444444
>> (1871)    20051231.99444444
>>
>>       yrStrt                                    = 1986
>>       yrLast                                   = 2005
>>
>>       f     = addfile ("hist_1850-2005_wind10.nc", "r")
>>       time   = f->time
>>       print(time) see above output
>>
>> ;  convert the time proleptic_gregorian calendar to UTC date
>>             YYYY   = cd_calendar(time,-1)/100    ;-- convert date to
>> UT-referenced date
>> ;  Set date variable names
>>            year     =  tointeger(utc_date(:,0))       ;-- get year as
>> integer value
>>           month    =  tointeger(utc_date(:,1))     ;-- get month as
>> integer value
>>           day      =  tointeger(utc_date(:,2))        ;-- get day as
>> integer value
>>           hour     =  tointeger(utc_date(:,3))       ;-- get hour as
>> integer value
>>           minute   =  tointeger(utc_date(:,4))     ;-- get minute as
>> integer value
>> ;  Write date as a string (YYYY.MM)
>>     date_str =  sprinti("%0.4i",year) + "/" + sprinti("%0.2i", month)
>>     return(date_str)
>>
>>       ;-- retrieve the indices of the selected years
>>
>>       iYYYY  = ind(YYYY.ge.yrStrt .and. YYYY.le.yrLast)
>>       print(iYYYY)
>>       hist_anom=f->wind10(iYYYY,:,:,:)
>>
>> but i get the error:
>>
>> CDMS error: Error on relative units conversion, string = day as %Y%m%d.%f
>>
>> CDMS error: Error on time conversion: invalid month = 10085
>>
>> Can someone help me to solve this?
>>
>> Sri
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.ucar.edu/pipermail/ncl-talk/attachments/20201217/94137913/attachment.html>


More information about the ncl-talk mailing list