This archive contains answers to questions sent to Unidata support through mid-2025. Note that the archive is no longer being updated. We provide the archive for reference; many of the answers presented here remain technically correct, even if somewhat outdated. For the most up-to-date information on the use of NSF Unidata software and data services, please consult the Software Documentation first.
Greetings! Trying to make a collection of GRIB messages look like a netCDF Dataset is a pretty interesting process. Because each GRIB message is essentially one variable at one level (or layer) at one time means we have to aggregate similar grids together into multidimensional variables. Part of that process involves creating the dimensions, such as time. Unfortunately, we do not control the order in which we receive the messages (nor if we receive all messages), so we have to take a rather simplistic approach in how we create and name things. For something like time, whatever variable is stored in the first message we read in a given GRIB file (just a bunch of GRIB messages concatenated together), we will give that a time dimension called "time". The next message we encounter with a different flavor of time (say, precip accumulation over a time period), we'll call that dimension time2. As you've seen, with GRIB, there can be many different distinct time dimensions, and the naming isn't predictable in the sense that you can hard code "time" in as the dimension and variable ahead of a priori. However, you can programmaticly look at the dimensions on a variable to figure out dimension names and access their values through their associated coordinate variables, all without ever using a hardcoded string variable. For any given dataset, the name of the time dimension might change, but its position in the listing of dimensions will remain the same. You can use this to get the times, lats, and lons. For example, let's say we have a Dataset with the variable "Geopotential_height_isobaric": # what are the dimension names of the variable "Geopotential_height_isobaric" print(dataset.variables['Geopotential_height_isobaric'].dimensions) ('time1', 'isobaric4', 'lat', 'lon') # get the name of the time dimension associated with the # "Geopotential_height_isobaric" dtime = dataset.variables['Geopotential_height_isobaric'].dimensions[0] # the vaule of dtime is 'time1' # get the array of time values (values are seconds since some start time, or # something like that) times = dataset.variables[dtime] # Convert times using the num2date function available through netCDF4 # (gives you python datetime objects) vtimes = num2date(times[:], times.units) # get the names of the lat and lon dimensions dlat = dataset.variables['Geopotential_height_isobaric'].dimensions[2] dlon = dataset.variables['Geopotential_height_isobaric'].dimensions[3] # get the lat and lon arrays associated with "Geopotential_height_isobaric" lat = dataset.variables[dlat][:] lon = dataset.variables[dlon][:] Let me know if that help! Sean > Hello- > > I have been using python to create weather products based on the data found > on thredds.ucar.edu > > I have noticed in some on the model data that the time dimension varies > between time, time1, time2, an time3 > > Is there any way to predict this? Or programmatically a way to dynamically > set this so I can handle the variability gracefully. > > Please help me understands this variability. > > Thanks, Ticket Details =================== Ticket ID: AWG-971354 Department: Support THREDDS Priority: Normal Status: Open =================== NOTE: All email exchanges with Unidata User Support are recorded in the Unidata inquiry tracking system and then made publicly available through the web. If you do not want to have your interactions made available in this way, you must let us know in each email you send to us.