Why is ncread reading in times which are wrong by a year?
    6 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    K E
      
 el 4 de Ag. de 2015
  
    
    
    
    
    Editada: Kelly Kearney
      
 el 14 de Ag. de 2015
            I am getting the wrong year when I read in data from the file below using ncread.
url = 'http://nomads.ncep.noaa.gov:9090/dods/wave/wna/wna20150804/wna20150804_00z';
timeFromNetcdf = ncread(url, 'time');
datestr([timeFromNetcdf(1) timeFromNetcdf(end)])
ans =
04-Aug-2014 00:00:00
11-Aug-2014 12:00:00
You can see from the file name that the year is actually 2015 not 2014. Am I doing something wrong in ncread, perhaps due to the zero-based index in netcdf vs. one-based index in matlab, or is the time variable in the netcdf file simply wrong?
0 comentarios
Respuesta aceptada
  Kelly Kearney
      
 el 6 de Ag. de 2015
        
      Editada: Kelly Kearney
      
 el 6 de Ag. de 2015
  
      No, it's not a bug. Matlab datenumbers are defined as days since Jan 0, 0000. But if you look at the attributes for your time variable:
>> ncdisp(url, 'time')
Source:
           http://nomads.ncep.noaa.gov:9090/dods/wave/wna/wna20150804/wna20150804_00z
Format:
           classic
Dimensions:
           time = 61
Variables:
    time
           Size:       61x1
           Dimensions: time
           Datatype:   double
           Attributes:
                       grads_dim     = 't'
                       grads_mapping = 'linear'
                       grads_size    = '61'
                       grads_min     = '00z04aug2015'
                       grads_step    = '3hr'
                       units         = 'days since 1-1-1 00:00:0.0'
                       long_name     = 'time'
                       minimum       = '00z04aug2015'
                       maximum       = '12z11aug2015'
                       resolution    = 0.125
you'll see that the reference time for that variable is Jan 1, 0001. So the proper conversion is
 t = ncread(url, 'time') + datenum(1,1,1);
 datestr(t([1 end]))
 ans =
 06-Aug-2015 00:00:00
 13-Aug-2015 12:00:00
(Though there seems to be a 2-day shift in there... if this is model data based on a 365-day year or something like that, then datenumbers may not be the best thing to use).
2 comentarios
  Kelly Kearney
      
 el 14 de Ag. de 2015
				
      Editada: Kelly Kearney
      
 el 14 de Ag. de 2015
  
			The add_offset and scale_factor properties are universal characteristics of netCDF data, defined in the file conventions, so ncread was designed to look for these properties.
However, the units property of a time dimension (or any dimension or variable, for that matter) is completely arbitrary. Your file happens to use days as a unit, but it could be seconds, hours, blue moons, whatever... there's really no way for ncread to know what conversion you would want.
Más respuestas (1)
  Rohit Kudva
    
 el 6 de Ag. de 2015
        Hi,
I executed the code you provided and I was able to reproduce this issue. This seems to be a bug in MATLAB. I work for MathWorks and I have forwarded this feedback to the appropriate product team.
- Rohit
0 comentarios
Ver también
Categorías
				Más información sobre NetCDF en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

