[ncl-talk] Adding time coordinate

Dennis Shea shea at ucar.edu
Tue Jan 12 22:14:45 MST 2021


I agree with DaveA.

I , also, do not understand your code. You must do a better job of
explaining the objective.

[1] Do you just want to convert the text file to a netCDF file?

[2] Some sort of grid???

You define a grid style variable "new_data"
       new_data           = new((/nlat,mlon,ntimes/),"float")

        new_data!0         = "lat2"
        new_data!1         = "lon2"
        new_data!2         = "time"

        new_data&lat2      =  lat2
        new_data&lon2      =  lon2
        new_data&time      =  time

To me, it looks like you are trying to directly place the raw  values into
the 'new_data'  array.

In fact, because each time is unique, there will be ntime=dimsizes(time)=
*6024 * grids with one value per grid.

;;;;new_data({lat(i)},{lon(i)},{time(i)}) =
new_data({LAT(i)},{LON(i)},{time(i)})+(/var(i)/)

---
Also, the way you are accessing the various fields is wrong.

NCL is confusing the - delimeter embedded with thh yyyy-mm-dd with a
numeric minus sign.

2015-02-19 00:01:27;733939380;-18.4340369;-56.829563;-28
        ^    ^
===================================================

        datas := asciiread(pthasc(j),-1,"string")
        nline  = dimsizes(datas)
print("nline="+nline)

; NCL code is confusing the - delimeter with a minus sign
; Change delimeter embedded with yyyy-mm-dd to yyyy mm dd
; There may be better ways but (1) converting string to character
;                              (2) converting - character to : character
;                              (3) change : character to : string

        datac := tochar(datas)      ; (nline,:)
        datac(:,4) = tochar(":")
        datac(:,7) = tochar(":")
        datas  = tostring(datac)    ; overwrite original
;;print(datas)
        nfld   = str_fields_count(datas(0), delim)  ; look at 1st line only
print("nfld="+nfld)

        yyyy  := toint(str_get_field(datas,  1, delim) )
          mm  := toint(str_get_field(datas,  2, delim) )
          dd  := toint(str_get_field(datas,  3, delim) )
          hh  := toint(str_get_field(datas,  4, delim) )
          mn  := toint(str_get_field(datas,  5, delim) )
          sc  := toint(str_get_field(datas,  6, delim) )

        time  := cd_inv_calendar(yyyy,mm,dd,hh,mn,sc,tunits, 0)
        time!0 = "time"
        ntimes = dimsizes(time)
 printVarSummary(time)
        LAT   := todouble( str_get_field(datas, 8, delin) )    ; fields
count starts at 1
        LON   := todouble( str_get_field(datas, 9, delim) )
        VAL   := todouble( str_get_field(datas,10, delim) )
 print("time="+time+"  yyyy="+yyyy+"  mm="+mm+"  dd="+dd+"  hh="+hh \
      +"  mn="+mn+"  sc="+sc+"  LAT="+LAT+"  LON="+LON+"  VAL="+VAL)





On Tue, Jan 12, 2021 at 7:58 PM Dave Allured - NOAA Affiliate via ncl-talk <
ncl-talk at mailman.ucar.edu> wrote:

> Sure, one netcdf file per day, 1 km grid.  But simple application of the
> cd_inv_calendar function only gets you a long 1-D array of exact times.  It
> is not sufficient to determine the structure of the desired result file.
>
> This still leaves the question of how you want to carry the time-of-day
> information inside that one file.  The related questions are, do you want a
> 2-D or 3-D array in the file, and what are the times of day on the third
> dimension.  If the array is 3-D, then that means multiple grids within a
> single day.  There are many examples of multiple grids per day in other
> data sets, and they are almost always regularly spaced over time, such as
> one grid per hour.
>
> It is even possible to have a single data grid, and a companion grid that
> has exact time of day at each grid point.  This would be unusual, but not
> difficult.  Also, for this you would need to decide what to do about
> multiple obs at the same grid point.
>
> So forget the details of NCL for a minute.  Please describe specifically
> the grid or grids that you would like, and their spacing across time of
> day.  This will work any way you like, as long as you can fully describe
> the shape of the desired end product.
>
>
> On Tue, Jan 12, 2021 at 4:17 PM Vanúcia Schumacher <
> vanucia-schumacher at hotmail.com> wrote:
>
>> So, in fact what I need is just the hour and minute information, but the
>> easiest way I found was to use the cd_inv_calendar function.
>> How do you suggest that I can attach this information to the new_data
>> variable?
>> The purpose of the script is to spatialize the input data to a regular
>> 1km grid.
>> The input data is just one example of several data in which I use to
>> generate a netcdf file per day with this script.
>>
>>
>> ------------------------------
>> *De:* Dave Allured - NOAA Affiliate <dave.allured at noaa.gov>
>> *Enviado:* terça-feira, 12 de janeiro de 2021 16:39
>> *Para:* Vanúcia Schumacher <vanucia-schumacher at hotmail.com>
>> *Cc:* ncl-talk at ucar.edu <ncl-talk at ucar.edu>
>> *Assunto:* Re: [ncl-talk] Adding time coordinate
>>
>> Okay.  It looks like your original dates and times are not regularly
>> spaced, and you are trying to make a new set of time coordinates by setting
>> seconds = 0.  This results in more irregular time values with some
>> duplicate values, which are not legal for coordinate subscripting.  This is
>> the error "Non-monotonic coordinate value".
>>
>> It looks like your input file spans all 24 hours in one day.  Can you
>> please explain exactly what you want the new time coordinates to look
>> like?  Are they regularly spaced or irregular?  Start and end times?
>>
>>
>> On Tue, Jan 12, 2021 at 4:51 AM Vanúcia Schumacher <
>> vanucia-schumacher at hotmail.com> wrote:
>>
>> Using your sugestion:
>> ntimes = dimsizes(time)
>> new_data = new((/nlat,mlon,ntimes/),"float")
>> I got this error:
>> fatal:NclOneDValGetClosestIndex: Non-monotonic coordinate value being
>> used, can't complete coordinate subscript
>> fatal:Could not obtain coordinate indexes, unable to perform subscript
>> fatal:["Execute.c":8640]:Execute: Error occurred at or near line 89 in
>> file test.ncl
>> The line 89:   new_data({lat(i)},{lon(i)},{time(i)}) =
>> new_data({lat(i)},{lon(i)},{time(i)})+(/var(i)/)
>>
>> Using this:
>> ntimes = dimsizes(time(1))
>> new_data = new((/nlat,mlon,ntimes/),"float")
>> I got this error:
>> fatal:Coordinate variables must be the same dimension as their dimension
>> fatal:No coordinate variable exists for dimension (time) in variable
>> (new_data)
>> fatal:["Execute.c":8637]:Execute: Error occurred at or near line 86 in
>> file test.ncl
>> The line 86: new_data&time     = time
>>
>> Attached is the script and a test data.
>> Thanks
>> ------------------------------
>> *De:* Dave Allured - NOAA Affiliate <dave.allured at noaa.gov>
>> *Enviado:* segunda-feira, 11 de janeiro de 2021 22:55
>> *Para:* Vanúcia Schumacher <vanucia-schumacher at hotmail.com>
>> *Cc:* ncl-talk at ucar.edu <ncl-talk at ucar.edu>
>> *Assunto:* Re: [ncl-talk] Adding time coordinate
>>
>> Please show the complete text for line 75, the complete error message,
>> and printVarSummary for the array new_data, just before line 75 is
>> executed.  Also please attach the current version of your script.  Thank
>> you.
>>
>>
>> On Mon, Jan 11, 2021 at 5:39 PM Vanúcia Schumacher <
>> vanucia-schumacher at hotmail.com> wrote:
>>
>> Thanks for the help, but the error persists in the line 75
>>
>> PrintVarSummary:
>>
>> Variable: nlat
>> Type: integer
>> Total Size: 4 bytes
>>             1 values
>> Number of Dimensions: 1
>> Dimensions and sizes: [1]
>> Coordinates:
>>
>> Variable: mlon
>> Type: integer
>> Total Size: 4 bytes
>>             1 values
>> Number of Dimensions: 1
>> Dimensions and sizes: [1]
>> Coordinates:
>>
>> Variable: ntimes
>> Type: integer
>> Total Size: 4 bytes
>>             1 values
>> Number of Dimensions: 1
>> Dimensions and sizes: [1]
>> Coordinates:
>> (0) 6024
>>
>> *De:* Dave Allured - NOAA Affiliate <dave.allured at noaa.gov>
>> *Enviado:* segunda-feira, 11 de janeiro de 2021 20:27
>> *Para:* Vanúcia Schumacher <vanucia-schumacher at hotmail.com>
>> *Cc:* ncl-talk at ucar.edu <ncl-talk at ucar.edu>
>> *Assunto:* Re: [ncl-talk] Adding time coordinate
>>
>> Your script looks pretty good so far.  This does not look right:
>>     new_data = new((/nlat,mlon,toint(time(1))/),"float")
>>
>> Try this:
>>     ntimes = dimsizes (time)
>>     new_data = new((/nlat,mlon,ntimes/),"float")
>>
>> Always use printVarSummary when you are having problems with arrays; and
>> look at dimensions, coordinates, attributes, and such.
>>
>> Also, in the future, please show the *first* error received, and be sure
>> to show exactly which line it occurs on.  Usually the first error causes
>> more problems later, and it is harder to sort out.  I am not sure what
>> happened this time, but that does not matter now.  Good luck.
>>
>>
>> On Mon, Jan 11, 2021 at 2:51 PM Vanúcia Schumacher via ncl-talk <
>> ncl-talk at mailman.ucar.edu> wrote:
>>
>> Hi users,
>>
>> I need to add the time information (preference in hh and mn) extracted
>> from an ascii file to a new variable (new_data from script), but I am not
>> having success.
>> Attached is the script I am trying using the function cd_inv_calendar and
>> the error obtained:
>> fatal:No coordinate variable exists for dimension (time) in variable
>> (new_data)
>>
>> I appreciate some help to attach this information to my new variable
>>
>> _______________________________________________
> ncl-talk mailing list
> ncl-talk at mailman.ucar.edu
> List instructions, subscriber options, unsubscribe:
> https://mailman.ucar.edu/mailman/listinfo/ncl-talk
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.ucar.edu/pipermail/ncl-talk/attachments/20210112/5c0b5fbe/attachment.html>


More information about the ncl-talk mailing list