我在通过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日。
我想知道是否有人可以对此有所了解?提前谢谢,
吉姆
答案 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在这里有一个很好的总结: