1

我在通过 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 信息页面的时间如下:

时间:64 位实数数组 [时间 = 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 日。

问题来自“自 1-1-1 以来的天数”的 OPeNDAP 时间,该时间返回为 733470(在上述文件上尝试 ncdump)。据我所知,这实际上是 2009 年 3 月 5 日。这里的结果是 Matlab 和 EDC 等工具将初始日期定为 3 月 5 日。

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

吉姆

4

2 回答 2

2

除非其他工具以某种方式使用“最小”属性,否则我看不到第一次元素如何是 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
于 2013-10-09T12:18:47.057 回答
1

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

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

CE 2009 年 3 月 3 日 00:00:00.0 UT 的儒略日期为 JD 2454893.500000

CE 1 月 1 日 00:00:00.0 UT 的儒略日期为 JD 1721423.500000

因此,ASCAT 从第 1 年开始的时间是 733470 天。这与 GrADS/GDS 会计一致。答案都归结为参考日期。我怀疑netCDF4所谓的“标准”日历是这个从公历到儒略的USNO版本,而这不是matlab所做的。

因此,最好不要参考 0001 年 1 月 1 日,而是更接近现在的时间,从而避免新旧日历之间潜在的两天差异。但是,如果数据服务正在提供它(就像这里的情况一样),你就会被它困住。

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

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

于 2013-10-10T01:11:04.413 回答