感冒中,所以這一篇會比較短。(反正也沒什么太多可講的【不】) 本章我們將介紹用以讀寫netcdf文件的Python第三方庫:netCDF4。 不過在介紹netCDF4之前,我覺得還是應該來說說nc文件的格式問題。 雖然nc文件我們一直在用,不過其實這個數據的具體格式對很多人來說依然是個未知數,就像一個黑匣子一樣。究其原因,很大程度上是因為nc文件相比一般的二進制文件、文本文件,包含了除了數據本身之外的維度、屬性(是不是有點熟悉?)等信息,想要讀取nc文件,必須得調用專門的函數進行解碼、識別。而這一操作是相當麻煩的。 如果想要在Fortran中進行nc文件的讀取,不但需要在編譯的時候注明netCDF庫的路徑,同時讀取時需要經歷這樣的步驟:nc文件id獲取>變量id獲取>變量維數id獲取>為變量分配內存空間>讀取,這樣繁瑣的步驟。其中,如果搞錯了變量維數、變量數據類型、變量id,就算是一點差錯都會導致讀取不成功或者讀取到錯誤的結果。 如果是使用grads進行nc文件的讀取呢?誠然,grads內置了打開nc文件的函數,但是其實它只能識別標準的nc數據格式,有時候會碰到使用grads內部函數無法打開netcdf文件的情況。不過最蛋疼的還是數據處理:有過使用grads經驗的人應該都知道grads在代碼編寫、數據處理上面的麻煩之處;很多人都會選擇將數據輸出到二進制文件,再用Fortran去處理,但是這樣的操作往往會出現錯誤。 所以,如果有一個平臺既能方便快捷地讀取nc文件,又能支持數據處理,那該多好。 Python就提供了這樣一個平臺。 Python中支持nc數據讀寫的庫有很多,其中scipy和netCDF4較為出名,因為scipy主要還是一些科學計算的函數庫,所以這里我們著重介紹netCDF4。 netCDF4的下載地址在:https://pypi./pypi/netCDF4,它的github主頁在https://github.com/Unidata/netcdf4-python,感興趣的同學可以前去了解關于這個庫的更多信息。需要注意的是canopy本身沒有包含netCDF4,需要用戶自行下載安裝,具體方法可以參加之前的教程。 輸入: 如果沒有錯誤,那就說明安裝成功了。不過呢,因為netCDF4包含了很多的函數,通常我們要用到的只有Dataset一個,所以調用的時候請在腳本開頭輸入:
Dataset函數的作用是用只讀或者讀寫的方式打開nc數據文件。直接來看例子吧~ 這里的hgt1973.nc是1973年的日均高度場數據,而我所做的,就是用只讀的方式創建了nc文件對象a。到這一步我們就已經完成了nc文件的打開操作,下一步我們可以來查看一下變量: nc文件對象a有一個屬性叫做variable,顧名思義指代的是文件中的變量信息,而變量信息又有一個屬性叫做keys,指代了這些變量的名字。通過調用a.varibles.keys()就可以查看該文件中的變量名了。可以發現hgt1973.nc中包含了5個變量,分別為層次、維度、經度和高度場。如果是在Fortran中,知道了變量名我們還需要去查看變量的維數,才能最終確定需要分配的數組空間。不過Python作為一門動態語言是不需要考慮變量維數這一說的:賦值的同時即內存空間的分配。 說到a.variables.keys(),大家是不是覺得很像python的字典呢?所以想要獲得對應的變量數值就變得很簡單了: 如圖,通過直接賦值的方式我們便獲得了hgt1973中的變量“level”。實際上除了獲得數值,我們還可以查看“level”的其他屬性例如: 可以直接將level的基本信息打印到屏幕: 可以查看數據類型: 查看數據名(有時會和變量名不一樣): 查看維數: 等等,大家可以按下tab自行查看。 同理,我們也能夠直接讀取其他變量: 只要讀取出來,之后便能夠通過python中的其他數據處理過程進行處理了。 不過這個nc文件還相對箱單了一些,我們再來看個復雜一點的: Wrfinput_d02是一個wrf模式的初始場文件。用過wrf模式的讀者應該會知道,我們使用wrf進行數值模擬之前需要在namelist.input中進行大量的參數設置。而這些參數中的大部分都被寫入到了wrfinput之中。如: 邊界層參數化方案、陸面過程參數化方案以及網格中心經緯度。這些都不是作為變量存放在nc文件中的,而是以“屬性”的形式。所以如果你遇到variables中找不到的變量,可以直接在nc文件對象的屬性中查找。 讀取變量和查看變量信息的方式和之前一樣: 查看信息: 讀取變量: 因為wrfinput的nc數據類型更為復雜,所以它的變量包含了更多的屬性信息,例如C網格的間隔方向等等(如果不做模式的同學可以不用了解這個概念): 不管怎么樣,有了netCDF4這個庫,我們便可以方便快捷地讀取nc數據了~ 那么修改nc數據呢?也很簡單,只需要在打開文件時加上‘a’或者‘w’即可: 如圖,這里我已經對hgt.1973.nc中的level變量進行了修改。修改完畢后請不要忘記調用close進行關閉,這樣才能完成對數據的修改。 最后再來說說HDF數據。hdf和netCDF一樣,是一種自說明(即自帶了數據信息說明)常用的數據格式,很多時候用在衛星資料的儲存中。想要在Python中讀取hdf格式數據則需要下載對應的庫:hdf4、hdf5或者h5py。這里尤其請注意hdf的版本信息,hdf4和hdf5雖然一個是四一個是五,但實際的內部結構卻有很大不同,需要調用不同的庫進行解碼。不過只要用對了庫,其它的步驟和讀取nc文件都差不多,例如讀取風云衛星的標稱數據: 我這里只是讀取了該文件中的‘NomFileInfo’變量,這個變量中包含了衛星數據的一些基本信息。今后有機會的話我會來說說如何使用python讀取風云衛星的標稱hdf數據,并繪制衛星云圖: 不過心急吃不了熱豆腐,心急感冒也好不了。。。 所以我們下期再見咯!(吃藥躺床板去。。。 |
|
來自: LibraryPKU > 《科學計算》