? ? 第一次見到后綴名為.nc4的文件,是師姐發(fā)給我的 ,大學(xué)四年第一次見這種格式,實在是很驚恐。甚至在網(wǎng)上查找也是搜索:“nc4怎么打開”。幸好已經(jīng)有了上網(wǎng)搜代碼的經(jīng)驗,終于了解了一丟丟NetCDF。
? ? NetCDF(network Common Data Form)網(wǎng)絡(luò)通用數(shù)據(jù)格式是由美國大學(xué)大氣研究協(xié)會(University Corporation for Atmospheric Research,UCAR)的Unidata項目科學(xué)家針對科學(xué)數(shù)據(jù)的特點開發(fā)的,是一種面向數(shù)組型并適于網(wǎng)絡(luò)共享的數(shù)據(jù)的描述和編碼標(biāo)準(zhǔn)。NetCDF廣泛應(yīng)用于大氣科學(xué)、水文、海洋學(xué)、環(huán)境模擬、地球物理等諸多領(lǐng)域。用戶可以借助多種方式方便地管理和操作 NetCDF 數(shù)據(jù)集。(這段文字復(fù)制的百度百科。)
? ? 接下來,我以全球海溫數(shù)據(jù)(來源于All Gridded Datasets: NOAA Physical Sciences Laboratory)為例,來介紹一下如何利用Python(Jupyter Notebook)來進行nc數(shù)據(jù)格式讀取與創(chuàng)建。
1、nc數(shù)據(jù)格式讀取
? ? 首先,我們需要netCDF4模塊,利用nc.Dataset(file)讀取文件后,可使用dataset_name.variables.keys()查看文件的keys。

? ? 而查看每個keys的屬性則是用dataset_name.variables['key_name'],如下:

? ? 以time為例,我們可以注意到time的數(shù)據(jù)類型是Float64,數(shù)據(jù)的最開始記錄時間(days since ...),當(dāng)前數(shù)據(jù)的量,以及空缺時的填充,我認(rèn)為這些是需要注意的。lon的話還需要注意actual_range,表示其經(jīng)度的范圍。
? ? 然后我們就可以讀取數(shù)據(jù)啦!

? ? 我們可以發(fā)現(xiàn)我這里有兩種形式,我們可以對比一下sst和ssts:


? ? 可以發(fā)現(xiàn)一個是masked_array,缺測值被掩碼了,而ssts是array,會顯示缺測值為填充值,即9.969209968386869e+36。
? ? 當(dāng)我們查看time的時候(上面times不小心多打了個s,后續(xù)改過來了,懶得改圖了),我們發(fā)現(xiàn)格式并不是我們想的那樣:

? ? 這時,我們需要用nc.num2date來處理一下,如下:

? ? 這樣,我們的time就變成了我們想要看到的格式?。。?/p>
2、創(chuàng)建nc文件
? ? 我將以我的畢設(shè)中所處理出來的一部分結(jié)果為例,來說明如何創(chuàng)建nc文件。
? ? 首先是利用nc.Dataset (file)創(chuàng)建一個空nc文件,注意后面一定要有‘w’表示可寫。

? ? 然后,為這個nc文件定義數(shù)據(jù)維度,使用的是createDimension語句,如下:

? ? 'lon'表示維度的名稱,len(lon)表示維度的大小,我上面是讀取了lon所以直接寫的,當(dāng)要定義其他的大小時,直接寫下大小就可以了。
? ? 然后,基于定義的維度創(chuàng)建變量,使用createVariable:

? ? 然后,存儲數(shù)據(jù)到變量:

? ? 最后,關(guān)閉文件,d.close(),大功告成?。。?/p>
? ? 當(dāng)然,大家還可以為變量和數(shù)據(jù)集添加屬性等,比如添加文件標(biāo)題,要使用dataset_name.title。
? ? 另外,如果大家的數(shù)據(jù)有缺測值時,也需要用到ma.masked_greater_equal()、ma.masked_less_equal()等來進行掩碼:

? ? 這也是我的第一次處理nc數(shù)據(jù),如果有不正確的地方,還請指正。