netCDF全稱是network Common Data Format(網絡通用數據格式),是由美國大學大氣研究協會(University Corporation for Atmospheric Research,UCAR)的Unidata項目科學家針對科學數據的特點開發的,是一種面向數組型並適於網絡共享的數據的描述和編碼標准。目前,NetCDF廣泛應用於大氣科學、水文、海洋學、環境模擬、地球物理等諸多領域。
我們使用python對數據進行分析處理,首先我們需要下載安裝netCDF4包,可使用pip一鍵安裝。
此外我們還要用到python中numpy這個數據處理包,安裝完成之后我們就可以着手處理數據。這里導入os包是為了處理當前目錄下的NC文件。
netCDF文件的數據格式
(圖摘自百度百科)
我們重點看第一個特點:自描述性。為什么NC文件具有自描述性?不像一般的數據集,里面只裝有純數據值,NC文件主要用於氣象,天文,海洋學等方面,它含有的值都對應着現實世界中的某個變量,結構較為復雜,所以它內部所含有的數據不僅僅是值的集合,它還需要告訴讀取它的人自己包含什么樣的數據(變量Variable),這些數據在現實世界中代表什么(屬性Attribute),以及數據的值依賴於什么(維度Dimension)。
舉個例子,假如我們要表示某海洋內部的水壓(Pressure)和溫度(Temperature),這時Pressure就是變量Variable,為了得到它的值,我們需要提供如下信息:海洋坐標對應的經緯度(Longitude,Latitude),水深(Depth),若更確切的話可能還有時間(Time),這些就是數據Pressure的維度,即Pressure = f(longitude, latitude, Depth, Time),是個四維的變量。Pressure的屬性即是"Pa"(壓力單位,Pressure:unit = "Pa")。而它的維度值從何處得來呢?實際上,每個維度在NC文件中也是一個變量,例如Depth,它是個一維的變量,相當於一個數組,通過索引可以提取它的值。同樣它也有自己的屬性——Depth:unit="m"(米)。
實際上NC文件它本身還含有關於自己的屬性,例如該文件各變量的取值范圍,文件的來源,文件的歷史信息,文件的版權聲明等等,都可以寫進去,所以我們說,NC文件具有自解釋性。搞清楚了NC文件的結構格式,我們可以開始進行數據的提取。
關於如何獲取NC文件的內部信息,我們使用到了python中的netCDF4包來讀取:
Dataset即是netCDF4包中提供的讀取NC文件的接口,此時我們就擁有了一個數據集,進而查看數據集中的各種信息。
通過調用Dataset提供的各種API可以查看數據集的各種信息,這里輸出了NC文件的屬性信息:
查看NC文件中變量以及它們的屬性:
輸出(節選為salinity的輸出):
可見NC對於變量解釋的還是十分詳細的。
我們需要提取變量salinity的值,我們可以看到它的最后一個屬性coordinates有四個值——(time, depth, lat, lon), 即四維屬性。隨后我們需要查看這四個變量的信息。
這里輸出的是這四個變量的域,可見time只有一個值,類似於標量。
然后輸出維度所對應變量的值域,這里只顯示了前五個值(實際上depth是40大小,應該有40個值):
這里需要重點解釋一下—,如何通過維度取到變量的值。例如我們看到變量depth是個一維的變量,我們就可以把它看成一維數組,即Depth[0:5] = [0.0, 2.0, 4.0, 6.0, 8.0, 10.0],以變量salinity這個四維變量為例,我們已經知道salinity = f(time, depth, longitude, latitude)。現在假設其它三個變量的取值范圍如下:
- time = [t1]
- longitude[0:5] = [long1, long2, long3, long4, long5]
- latitude[0:5] = [lat1, lat2, lat3, lat4, lat5]
為了提取變量salinity對應的值,我們需要這樣:
- dst["salinity"][0][0][0][0]; # 提取時間t1,深度0.0m,經度long1,緯度lat1的鹽度值
- dst["salinity"][0][2][3][4]; # 提取時間t1, 深度4.0m,經度Long4,緯度lat5的鹽度值
注意這里數組的索引並不就代表了其所表示維度的值,它們表示的是——該維度取值范圍的第N個值(N為索引),所以我們需要查看每個維度的取值范圍,並取得他們的索引范圍,然后才能利用這個索引范圍提取所需數據。
綜上所述,處理數據的大致過程是:
- 查看NC文件信息,獲取要提取的數據范圍
- 通過各個維度的信息,得到索引范圍
- 利用for循環讀取數據
csv文件的轉化
我們還需要一個python包來完成任務,就是pandas包(不是熊貓的意思,是python data analysis 的縮寫),它內部有個DataFrame結構,可以很方便的將讀取后的數據轉化為csv文件結構:
這里的arr就是經過循環處理后得到的numpy數組(Numpy.asarray(...)可以將普通數組轉換為pandas能接受的數組),column是csv文件的列名信息。事實上也可以很方便的轉化為json文件,如圖所示。
展示一下結果:
列名為自行規定的,空值是由於數據文件缺失值,屬正常現象,可以自己采用插值方法來填補空白。