2013-10-07 99 views
1

我在通過OPeNDAP提供的文件中運行了日期時間約定的問題。特別是GrADS DODS服務器(GDS)出現這個問題。 GDS可以通過讀取包含二進制文件特性的數據描述符(ascii文件)來提供文件(GDS不限於netCDF作爲輸入)。數據描述符文件定義了開始時間和增量。不知何故,GDS將其轉換爲「自1-1-1 00:00:00以來的日子」的約定(?)。我發現了一個有趣的問題。通過OPeNDAP的日期時間約定

作爲一個例子,在供應的http://apdrc.soest.hawaii.edu:80/dods/public_data/satellite_product/ASCAT/daily數據被定義爲開始於03 2009年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日。

麻煩來自OPeNDAP時間「從1-1-1」以來的天數,返回值爲733470(在上述文件中嘗試ncdump)。據我所知,這實際上是2009年3月5日。這裏的結果是像Matlab和EDC這樣的工具得到的最初日期爲3月5日。

我想知道是否有人可以闡明這一點?在此先感謝,

吉姆

+0

是否有可能與數據提供商合作,有一個更好的時間單位?這似乎是Unix紀元當你正在處理的以上2000年的時間尺度將是衛星數據更好的選擇從2009年開始,這是什麼意思有2天的差異? –

+0

的問題是,它的價值的數據真的不2000多年,但啓動時間是參照2000年前。我相信這是由OPeNDAP服務器自動完成(輸入文件有2009年3月03日的開始日期)。 – JimP

回答

2

除非其他工具使用「最小」屬性不知何故,我不能在第一時間看到元素如何能03 - 2009年。

然而,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

我想可能已經找到了解釋:

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

CE 200的Julian日期3月9日3 00:00:00。0 UT是 JD 2454893.500000

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

於是開始ASCAT的時間自今年1起源733470天。這符合 的的GrADS/GDS會計。答案都歸結爲參考日期。我懷疑什麼netCDF4所謂的「標準」日曆是由陽曆切換到朱利安這個USNO版本,這不是MATLAB做什麼。

這也可能是更好的做法,因此,不參考1月1日,0001而是更接近於目前從而避免新老曆法之間的電位2天差異。但是,如果一個數據服務提供了它(就像這裏的情況那樣),那麼你就會困惑於它。

埃裏克射擊有一個很好的總結在這裏:

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