如何用NCL描述時間

如何用NCL描述時間

前言

縱使二進位 (Binaries) 檔案有體積小、方便輸出的優勢,但是過於簡潔也導致處理資料的困擾。以我的觀察,很少人有撰寫完整的使用說明的習慣,最多就是口頭指點一番。於是我很怕拿到二進位檔案,因為不清楚資料分布的特性,得花上不少時間確定沒有把經緯度、高度、時間各軸搞錯。

當我碰到 NCL+netCDF 這個組合時,不知道有多麼高興(雖然裝netCDF好像不是那麼容易 囧)。 netCDF 格式裡可以清楚看見各參數的單位、維度名稱與尺寸,模式輸出檔案還有漂亮的時間資訊。

基本的時間資訊包含哪些屬性?

ncl_filedump 叫出一個輸出檔作為範例:

上面這個案例中,「time」就是時間資訊:這個參數至少會包含以下兩個屬性「 calendar」、「units」。特別重要的是「units」,他是用來作為時間資訊的「基準點」。就好比日常生活中,我們會用「西元」訂為基準,把歷史事件分為西元前、西元後。

話說回來,「units」這個字串是可以自由選擇基準點的,只要字串格式符合規定就好。 NCL 6.3.0 版來說,字串的格式為「時間單位+介系詞+時間基準點」,詳見相關函式的說明。至於為什麼多半使用「1900年1月1號0點0分」,我想只是為了方便,自己寫的程式倒是不見得一定要用這個基準點。

常見的時間格式

  • UT-referenced date:我們所熟悉的「年月日時分秒」、優點為好閱讀,通常以「六組」獨立的參數儲存。
  • mixed Julian/Gregorian date:依照屬性「units」所規定的時間基準點,所組成的「一組」精簡化的雙精確度數字。因為已簡化為一維陣列,所以能作為「Coordinate variables」使用。

看下面這個例子應該會對上述兩種日期格式更清楚:

程式執行出來的結果:

總結來說,自行處理完的資料,其儲存所使用的時間格式以 mixed Julian/Gregorian date 為優先考量。

哪裡會用到時間格式?

  • 篩選特定時間的資料作分析:附上時間資訊之後,就可以利用 Coordinate subscripting "{...}" 過濾出想要的時間區段,例如,有個參數 QSNOW ( Time, bottom_top, south_north, west_east ),利用下面的 NCL 指令擷取出2015年三月的所有資料:QS=QSNOW{20150301:20150331,:,:,:}
  • 以時間表示的特殊座標軸,詳見NCL官網的Time labels
  • 另外有件事情要注意一下,雖然說目前 (NCL 6.3.0) 已經用 「cd_calendar」系列函式取代「ut_calendar」等函式,不過當你的時間格式中的「units」單位是採用”minutes”或”seconds”時,「cd_xxx_calendar」會有bug,因此建議使用舊的「ut_xxx_calendar」函式。我自己是有碰到這個bug,在NCL更新之前,我仍然都是ut開頭的函式為主。

[上述bug的原文出處]

Note: there is a potential rounding bug in cd_calendar which causes a problem in this routine if you have a units of “minutes since” or “seconds since”. It sometimes causes the minutes/seconds to be returned as something like “0/60” (0 minutes/60 seconds) rather than “1/0” (1 minute/0 seconds). If you are affected by this bug, then you may be able to use ut_string as a work-around, if you are using a “standard” calendar.

發表迴響