A Brief History of (netCDF) Time

Dave Fulker (fulker@unidata.ucar.edu)
Fri, 26 Mar 93 16:57:11 -0700

I will attempt to give a little background and describe Unidata's
recommendation on how time should be stored in netCDF files.

The dimensions of netCDF variables often correspond to coordinates, one
of which may represent time. For each "coordinate dimension" there is
likely to be a variable which carries coordinate values corresponding to
indices along the dimension. For example, as shown in the NetCDF Users
Guide, it is common to have a netCDF dimension named "time" and a singly
dimensioned netCDF variable with the same name, "time(time)," called a
coordinate variable. The ncdump utility has special features for
displaying the values of coordinate variables.

We believe it is desirable for coordinate values of all kinds to be
treated similarly. This allows generic analysis/display packages to
handle space and time coordinates interchangably, for example, and
several netCDF-based software packages already do this. Therefore, we
have sought ways to represent time that require neither multiple numbers
nor character strings for each time value.

Our solution exploits: 1) the netCDF capability for assigning a unit of
measure to each variable, in the form of an attribute, and 2) a nice
units conversion package, udunits, which is available as a companion
to the netCDF library. Units of measure are character strings which
adhere to the (rather flexible) grammar employed in udunits; when units
of measure are conformable, udunits may be used to determine the
relationships between them and perform conversions. Critical to this
discussion is the fact that a units descriptor string may contain an
origin. The following example is taken from the NetCDF Users Guide:

time:units = "hours since 1990-11-25 12:00 UTC";

Another example, which corresponds precisely to the standard measure of
time in UNIX systms, is:

time:units = "seconds since 1970-1-1";

Similarly, the units may be in years, days, nanoseconds, and so forth.
With this mechanism, one can store time values in conventional numerical
formats (integer, real, double, etc.) and meet any accuracy requirement
we can envision. For more detail, please see the udunits documentation.

Thus, the Unidata recommendations for representing time values in netCDF
files are:

* Store time values in numerically typed variables (not attributes).

* Assign each such variable its proper unit of measure and origin by
using the associated "units" attribute.

* Values assigned to these "units" attributes should be interpetable by
the udunits package.

David Fulker
Unidata Program Center Director
University Corporation for Atmospheric Research
Boulder, Colorado