Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 通过OPeNDAP的日期时间约定_Matlab_Datetime_Netcdf_Opendap - Fatal编程技术网

Matlab 通过OPeNDAP的日期时间约定

Matlab 通过OPeNDAP的日期时间约定,matlab,datetime,netcdf,opendap,Matlab,Datetime,Netcdf,Opendap,我在通过OPeNDAP提供的文件中遇到了一个日期时间约定的问题。特别是这个问题来自GrADS DODS服务器(GDS)。GDS可以通过读取包含二进制文件细节的数据描述符(ascii文件)为文件提供服务(GDS不限于将netCDF作为输入)。数据描述符文件定义开始时间和增量。不知何故,GDS将其转换为“从1-1-1 00:00:00起的天数”的约定(?)。我发现了一个有趣的问题 例如,服务于的数据定义为从2009年3月3日开始。OPeNDAP信息页面包含以下内容: 时间:64位实数数组[time=

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

例如,服务于的数据定义为从2009年3月3日开始。OPeNDAP信息页面包含以下内容:

时间: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日

我想知道是否有人能解释一下?提前感谢,


Jim

除非其他工具以某种方式使用“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)

此数据源的日期编号为1-1-1,因此:

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

让我们读取数据并更新引用:

>> 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

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

CE 2009年3月3日00:00:00.0 UT的朱利安日期为 2454893.500000第纳尔

CE 1的朱利安日期为UT 1月1日00:00:00.0 1721423.500000约旦第纳尔

因此,ASCAT从第一年开始的时间是733470天。这与 毕业生/GDS会计。答案可以归结为参考日期。我怀疑netCDF4称之为“标准”日历的是这个USNO版本,它从格里高利历切换到朱利安历,而这不是matlab所做的

因此,最好不要参考0001年1月1日,而是更接近现在的日期,这样可以避免新旧日历之间可能存在的两天差异。但是,如果一个数据服务正在提供它(这里就是这样),那么您就有点被它卡住了

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


是否可以与数据提供商合作以获得更好的时间单位?对于2009年的卫星数据来说,Unix时代似乎是一个更好的选择。当你处理2000年左右的时间尺度时,2天的差异意味着什么?问题是,这并不是2000年的数据,而是2000年前的开始时间。我相信这是由OPeNDAP服务器自动完成的(输入文件的开始日期为2009年3月3日)。
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