通过OPeNDAP的日期时间约定

时间:2013-10-07 23:00:17

标签: matlab datetime netcdf opendap

我在通过OPeNDAP提供的文件中遇到了日期时间约定的问题。特别是这个问题来自GrADS DODS服务器(GDS)。 GDS可以通过读取包含二进制文件细节的数据描述符(ascii文件)来提供文件(GDS不限于netCDF作为输入)。数据描述符文件定义开始时间和增量。不知何故,GDS将其转换为“自1-1-1 00:00:00以来的日期”的约定(?)。我发现了一个有趣的问题。

例如,http://apdrc.soest.hawaii.edu:80/dods/public_data/satellite_product/ASCAT/daily提供的数据定义为2009年3月3日开始.OPeNDAP信息页面的时间如下:

time:64位实数的数组[time = 0..1141]

grads_dim: "t"
grads_mapping: "linear"
grads_size: "1142"
grads_min: "00z03mar2009"
grads_step: "1dy"
units: "days since 1-1-1 00:00:0.0"
long_name: "time"
minimum: "00z03mar2009"
maximum: "00z17apr2012"
resolution: 1.0 

所以它正确获得了第一次的价值。我已经在几个客户端工具中测试了这个,包括GrADS,Ferret,panoply和IDV;所有人都正确认出第一次的价值为2009年3月3日。

问题出现在OPeNDAP时间“1-1-1之后的天”,它返回为733470(在上面的文件上尝试ncdump)。据我所知,这实际上是2009年3月5日。这里的结果是Matlab和EDC等工具的初始日期为3月5日。

我想知道是否有人可以对此有所了解?提前谢谢,

吉姆

2 个答案:

答案 0 :(得分:2)

除非其他工具以某种方式使用'minimum'属性,否则我无法看到第一次元素是如何在2009年3月3日。

但是,2009年3月5日检查是否使用单位字段中的信息:

以下是我在MATLAB中看到的内容:

>> ncdisp('http://apdrc.soest.hawaii.edu:80/dods/public_data/satellite_product/ASCAT/daily','time')
Source:
           http://apdrc.soest.hawaii.edu:80/dods/public_data/satellite_product/ASCAT/daily
Format:
           64bit
Dimensions:
           time = 1142
Variables:
    time
           Size:       1142x1
           Dimensions: time
           Datatype:   double
           Attributes:
                       grads_dim     = 't'
                       grads_mapping = 'linear'
                       grads_size    = '1142'
                       grads_min     = '00z03mar2009'
                       grads_step    = '1dy'
                       units         = 'days since 1-1-1 00:00:0.0'
                       long_name     = 'time'
                       minimum       = '00z03mar2009'
                       maximum       = '00z17apr2012'
                       resolution    = 1

让我们看一下MATLAB的数字参考日期:

  
    

matlabRefDate = datestr(0)

  
matlabRefDate =

00-Jan-0000

此数据源的日期编号是1-1-1所以:

  
    

dataRefDate = '01 -Jan-0001';     dataRefDateNum = datenum(dataRefDate)

  
dataRefDateNum =

   367

让我们读取数据并更新参考:

>> time = ncread('http://apdrc.soest.hawaii.edu:80/dods/public_data/satellite_product/ASCAT/daily','time');
>> datestr(time(1))

ans =

03-Mar-2008

>> correctedTime = time+dataRefDateNum;
>> datestr(correctedTime(1))

ans =

05-Mar-2009

答案 1 :(得分:1)

我想我可能已经找到了解释:

来自http://aa.usno.navy.mil/data/docs/JulianDate.php

CE 2009年3月3日00:00:00.0的Julian日期UT JD 2454893.500000

1月1日00:00:00.0的CE的Julian日期UT是 JD 1721423.500000

因此,从第1年起,ASCAT开始的时间为733470天。这同意 GrADS / GDS会计。答案都归结为参考日期。我怀疑netCDF4称之为“标准”日历的是这个USNO版本,它从Gregorian切换到Julian,这不是matlab所做的。

因此,可能更好的做法是,不要参考0001年1月1日,而是更接近现在的事情,从而避免旧日历和新日历之间潜在的两天差异。但是,如果一个数据服务提供它(就像这里的情况那样),你就会陷入困境。

Eric Firing在这里有一个很好的总结:

http://matplotlib.org/api/dates_api.html