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! There are a few reasons why variables within the GRIB collections have a different number of time steps. One is due to some including the zero hour forecast, while others do not (note, a zero hour forecast field is generally different than an analysis field). Another reason is due to the way the National Centers for Environmental Prediction (NCEP) produces GRIB messages for a given variable. Very roughly, there are two types of variables that are constructed for a collection of GRIB messages - instantaneous variables and interval variables. Temperature at 2m (Temperature_height_above_ground), for example, would be an instantaneous variable, where as Total Precipitation Accumulation (Total_precipitation_surface_Mixed_intervals_Accumulation) would be an interval variable. Interval variables will always include something like {interval length}_{statistical process}, so something like 12_hour_Accumulation or Mixed_intervals_Accumulation. This all has to do with how netCDF-Java maps a collection of 2D GRIB messages into an ND netCDF-like Variable, and is described here: https://docs.unidata.ucar.edu/netcdf-java/5.2/userguide/grib_files_cdm.html#mapping-a-grib-collection-into-multidimensional-variables Now, in the case of GFS, and specifically the total precipitation variable, it turns out that NCEP computes the accumulation over several intervals, not just a fixed interval (say a 6 hour interval). This is all described in the variable metadata. Again, looking at the total precipitation in the case of 0.25 degree output from the 6Z run of the GFS on 2019-12-02 (https://thredds.ucar.edu/thredds/catalog/grib/NCEP/GFS/Global_0p25deg/latest.html?dataset=grib/NCEP/GFS/Global_0p25deg/GFS_Global_0p25deg_20191202_0600.grib2), the metadata look like (as seen from https://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/Global_0p25deg/GFS_Global_0p25deg_20191202_0600.grib2.html): Total_precipitation_surface_Mixed_intervals_Accumulation(time, lat, lon): long_name: Total precipitation (Mixed_intervals Accumulation) @ Ground or water surface units: kg.m-2 abbreviation: APCP missing_value: NaN grid_mapping: LatLon_Projection coordinates: reftime time lat lon Grib_Statistical_Interval_Type: Accumulation Grib_Variable_Id: VAR_0-1-8_L1_Imixed_S1 Grib2_Parameter: 0, 1, 8 Grib2_Parameter_Discipline: Meteorological products Grib2_Parameter_Category: Moisture Grib2_Parameter_Name: Total precipitation Grib2_Level_Type: 1 Grib2_Level_Desc: Ground or water surface Grib2_Generating_Process_Type: Forecast We see the dimensions of the variable are: time, lat, and lon where the lengths of those dimensions are: time = 180 lat = 721lon = 1440 We also see the "coordinates" associated with the variable are: coordinates: reftime time lat lon The name of the appropriate time variable to use will always be found in the "coordinates" attribute (following the Climate and Forecast metadata conventions). If we look at the time variable, we see: time(time): units: Hour since 2019-12-02T06:00:00Z standard_name: time long_name: GRIB forecast or observation time calendar: proleptic_gregorian bounds: time_bounds _CoordinateAxisType: Time If we look at the actual values of the time array, we see: (https://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/Global_0p25deg/GFS_Global_0p25deg_20191202_0600.grib2.ascii?time%5B0:1:179%5D): time[180] 3.0, 6.0, 9.0, 9.0, 12.0, 12.0, 15.0, 15.0, 18.0, 18.0,... As you can see here, we have some repeated values (e.g. there are two 12's, 15's, etc.), and this accounts for the different number of time steps in these kinds of variables. What this means, for example, is that there are two accumulated precipitation amounts that are valid at the 12 hour forecast. In order to distinguish between the two, you need to look at the metadata of the time variable. In that metadata, we see there is a "bounds" attribute whose value is time_bounds. Again, following the Climate and Forecast metadata conventions, this means you need to inspect the time_bounds variable for more information. If we look at that variable, we see: [0], 0.0, 3.0 [1], 0.0, 6.0 [2], 0.0, 9.0 [3], 6.0, 9.0 [4], 0.0, 12.0 [5], 6.0, 12.0 [6], 0.0, 15.0 [7], 12.0, 15.0 [8], 0.0, 18.0 [9], 12.0, 18.0 Pairing the time_bounds variable up with the time variable, we get the following (https://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/Global_0p25deg/GFS_Global_0p25deg_20191202_0600.grib2.ascii?time%5B0:1:179%5D,time_bounds%5B0:1:179%5D%5B0:1:1%5D): time[0], time_bounds[0][:]: Total precipitation valid at 3 hours into the forecast, representing the precipitation accumulation over the 0-3 hour period of time. time[1], time_bounds[1][:]: Total precipitation valid at 6 hours into the forecast, representing the precipitation accumulation over the 0-6 hour period of time. time[2], time_bounds[2][:]: Total precipitation valid at 9 hours into the forecast, representing the precipitation accumulation over the 0-9 hour period of time. So far, so good. Now it gets tricky: time[3], time_bounds[3][:]: Total precipitation valid at 9 hours into the forecast, representing the precipitation accumulation over the 6-9 hour period of time. So, the first time value of 9 (time index 2) is associated with a 9 hour accumulation, and the second time value of 9 (time index 3) is associated with a 3 hour accumulation. This is why the variable is considered a "Mixed interval" variable - there is not one unique accumulation period used by the GRIB messages produced by NCEP. This will be the case for any variable that includes "Mixed_intervals" in its name. Note that the name of the time variable, time dimension, and time bounds variable will likely change between model runs. That is because netCDF-Java creates these as a collection of GRIB messages is scanned (variable names and dimensions are not concepts found within a GRIB message and must be constructed), and the order in which we receive various messages from NCEP is not set. The GRID found within the first message will get assigned "time", for example, where GRIDs that require another set of times (mixed interval variables, for example), will be assigned "time2", "time3", etc. However, the name of the appropriate time variable will always be found in the "coordinates" attribute of a given variable, and that's what you should use. Cheers, Sean > My name is Luca and I am a meteorologist trying to access GFS data from > the UCAR servers. One issue I have found is that when I query for the > data, I tend to receive variables that are not the same length, which > is concerning for me. This is because some variables for example include > an initial time step, and some do not. > > An example would be for temperature at 2 meters, if I query for all > the times I receive a (129, 361, 720) matrix. This runs from 00z > to 00z 16 days later. But if I query for Total Precip, my matrix is > (138,361,720). Therefore I am unable to distinguish the time variables > for each of these variables. > > Is there a way for me to be able to distinguish times that are associated > with each variable? > > Thanks > > > Ticket Details =================== Ticket ID: CRZ-633675 Department: Support THREDDS Priority: Normal Status: Closed =================== 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.