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 情報ページには、次の時間があります。

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 日として正しく認識します。

この問題は、「1-1-1 からの日数」という OPeNDAP 時間から発生し、733470 として返されます (上記のファイルで ncdump を試してください)。私が知る限り、これは実際には 2009 年 3 月 5 日です。結果として、Matlab や EDC などのツールの最初の日付は 3 月 5 日になります。

誰かがこれに光を当てることができるかどうか疑問に思っていますか? 前もって感謝します、

ジム

4

2 に答える 2

2

他のツールが何らかの方法で「最小」属性を使用しない限り、最初の要素が 03-Mar-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
于 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 月 1 日 00:00:00.0 UT のユリウス日は JD 1721423.500000 です。

したがって、ASCAT の開始から 1 年目の開始までの時間は 733470 日です。これは、GrADS/GDS アカウンティングと一致します。答えはすべて基準日にあります。netCDF4 が「標準」カレンダーと呼んでいるのは、グレゴリオ暦からユリウス暦に切り替わるこの USNO バージョンであると思われますが、これは matlab が行うことではありません。

したがって、0001 年 1 月 1 日を参照するのではなく、現在に近いものを参照することをお勧めします。これにより、古いカレンダーと新しいカレンダーの潜在的な 2 日間の違いを回避できます。ただし、データ サービスがそれを提供している場合 (ここでのケースのように)、それで行き詰まってしまいます。

Eric Firing の素晴らしい要約がここにあります。

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

于 2013-10-10T01:11:04.413 に答える