亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

利用python如何處理nc數據詳解

2020-01-04 14:59:51
字體:
來源:轉載
供稿:網友

前言

這兩天幫一個朋友處理了些 nc 數據,本以為很簡單的事情,沒想到里面涉及到了很多的細節和坑,無論是“知難行易”還是“知易行難”都不能充分的說明問題,還是“知行合一”來的更靠譜些,既要知道理論又要知道如何實現,于是經過不太充分的研究后總結成此文,以記錄如何使用 python 處理 nc 數據。

一、nc 數據介紹

nc 全稱 netCDF(The Network Common Data Form),可以用來存儲一系列的數組,就是這么簡單(參考https://www.unidata.ucar.edu/software/netcdf/docs/netcdf_introduction.html)。

既然 nc 可以用來一系列的數組,所以經常被用來存儲科學觀測數據,最好還是長時間序列的。

試想一下一個科學家每隔一分鐘采集一次實驗數據并存儲了下來,如果不用這種格式存儲,時間長了可能就需要創建一系列的 csv 或者 txt 等,而采用 nc 一個文件就可以搞定,是不是很方便。

更方便的是如果這個科學實驗與氣象、水文、溫度等地理信息稍微沾點邊的,完全也可以用 nc 進行存儲, GeoTiff 頂多能多存幾個波段(此處波段可以認為是氣象、水文等不同信號),而 nc 可以存儲不同波段的長時間觀測結果,是不是非常方便。

可以使用 gdal 查看數據信息,執行:

gdalinfo name.nc

即可得到如下信息:

Driver: netCDF/Network Common Data FormatFiles: test.ncSize is 512, 512Coordinate System is `'Subdatasets: SUBDATASET_1_NAME=NETCDF:"test.nc":T2 SUBDATASET_1_DESC=[696x130x120] T2 (32-bit floating-point) SUBDATASET_2_NAME=NETCDF:"test.nc":PSFC SUBDATASET_2_DESC=[696x130x120] PSFC (32-bit floating-point) SUBDATASET_3_NAME=NETCDF:"test.nc":Q2 SUBDATASET_3_DESC=[696x130x120] Q2 (32-bit floating-point) SUBDATASET_4_NAME=NETCDF:"test.nc":U10 SUBDATASET_4_DESC=[696x130x120] U10 (32-bit floating-point) SUBDATASET_5_NAME=NETCDF:"test.nc":V10 SUBDATASET_5_DESC=[696x130x120] V10 (32-bit floating-point) SUBDATASET_6_NAME=NETCDF:"test.nc":RAINC SUBDATASET_6_DESC=[696x130x120] RAINC (32-bit floating-point) SUBDATASET_7_NAME=NETCDF:"test.nc":SWDOWN SUBDATASET_7_DESC=[696x130x120] SWDOWN (32-bit floating-point) SUBDATASET_8_NAME=NETCDF:"test.nc":GLW SUBDATASET_8_DESC=[696x130x120] GLW (32-bit floating-point) SUBDATASET_9_NAME=NETCDF:"test.nc":LAT SUBDATASET_9_DESC=[130x120] LAT (32-bit floating-point) SUBDATASET_10_NAME=NETCDF:"test.nc":LONG SUBDATASET_10_DESC=[130x120] LONG (32-bit floating-point)Corner Coordinates:Upper Left ( 0.0, 0.0)Lower Left ( 0.0, 512.0)Upper Right ( 512.0, 0.0)Lower Right ( 512.0, 512.0)Center ( 256.0, 256.0)

每一個 SUBDATASET 表示記錄的是一種格式的數據(氣象、水文等等),如果要想查看此 SUBDATASET 的具體信息,可以執行:

gdalinfo NETCDF:name.nc:SUBDATASET_NAME

此處的 SUBDATASET_NAME 為上面的 T2、PSFC 等等,可以得到如下信息:

Driver: netCDF/Network Common Data FormatFiles: test.ncSize is 120, 130Coordinate System is `'Metadata: LAT#description=LATITUDE, SOUTH IS NEGATIVE LAT#FieldType=104 LAT#MemoryOrder=XY LAT#stagger= LAT#units=degree_northCorner Coordinates:Upper Left ( 0.0, 0.0)Lower Left ( 0.0, 130.0)Upper Right ( 120.0, 0.0)Lower Right ( 120.0, 130.0)Center ( 60.0, 65.0)Band 1 Block=120x1 Type=Float32, ColorInterp=Undefined NoData Value=9.96920996838686905e+36 Unit Type: degree_north Metadata: description=LATITUDE, SOUTH IS NEGATIVE FieldType=104 MemoryOrder=XY NETCDF_VARNAME=LAT stagger= units=degree_north

此處只有一個 Band ,每一個 Band 記錄了一個時間點(或者其他區分形式)的一條記錄,這個記錄是一個數組。

所以看到這里,各位應該已經明白了,可以直接使用 GDAL 處理 nc 數據,比如直接使用 gdalwarp 將某個 SUBDATASET 轉成 GeoTiff 等等,此處暫且不表,各位只需要查閱一下 gdalwarp 手冊即可知道如何處理。

明白了以上信息基本也就清楚了如何處理此數據。

二、數據處理

python 是運用非常廣泛,自然其下各種類庫非常豐富,專業一點的說法就叫生態豐富。

2.1 netCDF4

此框架可以直接將 nc 讀取成數組(詳細信息參考https://github.com/Unidata/netcdf4-python )。讀取方式如下:

dataset = netCDF4.Dataset('name.nc') # open the dataset

這樣即可讀出整個 nc 中的數據信息,如果需要獲取某個 SUBDATASET 只需要使用 dataset[SUBDATASET_NAME] 即可,返回的是一個三維數組,表示不同時間段(或其他區分方式下)的數據信息。

我們可以對此數組做各種操作,如求平均值、方差等等,又讓我想起了大學里的那一堆枯燥但又讓人很有興趣的實驗課程。當然,此處如果使用 numpy 框架進行處理,會起到事半功倍的效果,如求長時間序列下的平均值:

np_arr = np.asarray(dataset[SUBDATASET_NAME])average_arr = np.average(np_arr, axis=0)

到這里跟地信有關的同志都會看出一個問題,此框架只能對數據進行處理,而不能進行與位置有關的操作,這就導致數據無法變成直白的地圖可視化效果。其實任何數據都是相通的,我們可以采用此種方式處理完后轉為 GeoTiff 等,當然我們也可以直接采用 GeoTiff 的處理流程來進行處理。

2.2 rasterio

rasterio 是 Mapbox 開源的空間數據處理框架,功能非常強大,此處不細說,只表如何處理我們的 nc 數據。

當然第一種方式就是使用 netCDF4 處理完之后,使用此框架寫入 GeoTiff,但是這樣不太優雅,而且使用了兩個框架,明顯過于麻煩,我們直接使用此框架從讀數據開始處理。

此處讀的時候就有技巧了,要像采用 gdalinfo 讀取 SUBDATASET 一樣來直接讀取此 SUBDATASET 數據,如下:

with rio.open('NETCDF:name.nc:SUBDATASET_NAME') as src: print(src.meta) dim = int(src.meta['count']) src.read(range(1, dim + 1))

即給 open 函數傳入 NETCDF:name.nc:SUBDATASET_NAME,采用 src.read(range(1, dim + 1)) 可以直接讀出此范圍內所有 Band (時間點)的信息,范圍可以自己設定,注意從 0 開始,當然也可以僅讀取某個 Band 的信息。

src.meta 記錄了此 SUBDATASET 的元數據信息,與 gdalinfo 看到的基本相同。

這樣我們就可以繼續將此數據使用 numpy 等框架進行處理,處理完之后更重要的是要寫入 GeoTiff 中(直白的說就是添加空間信息)。

也很簡單,如下即可:

with rio.open(newfile, 'w', **out_meta) as dst: dst.write_band(1, res_arr)

newfile 為存儲路徑,res_arr 為計算結果數組,注意尺寸不要發生變化(width*height),out_meta 為目標文件的元數據描述信息,可以直接將上面 src.meta 進行簡單處理即可。

out_meta =  meta.update({"driver": "GTiff",   "dtype": "float32",   'count': 1,   'crs': 'Proj4: +proj=longlat +datum=WGS84 +no_defs',   'transform': rasterio.transform.from_bounds(west, south, east, north, width, height)  })

crs 表示目標數據空間投影信息,transform 表示目標文件 空間范圍信息,可以通過經緯度信息和圖像尺寸等計算得到。

dst.write_band 將數據寫入對應波段,當然此處也可以寫入多個波段,根據計算結果而定,同樣從 1 開始。

三、總結

本文簡單介紹了 nc 數據的特點及如何使用 python 處理 nc 數據。每個目標都有多條路可以達到,重要的是找到那條自己喜歡的和適合自己的路,然而話又說回來,即使走的不是想要的那條路,不是一樣可以達到目標嘛!所以關鍵是要找到自己的目標。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人在线网站| 久久久久亚洲精品成人网小说| 国产成人aa精品一区在线播放| 欧美激情中文网| 国产欧美婷婷中文| 亚洲香蕉在线观看| 国产精品视频免费观看www| 国产综合久久久久久| 欧美午夜性色大片在线观看| 亚洲国产精品99| 欧美亚洲国产精品| 538国产精品一区二区在线| 欧美乱大交xxxxx另类电影| 日韩高清av一区二区三区| 久久亚洲国产成人| 成人高清视频观看www| 日韩欧美亚洲范冰冰与中字| 国产97免费视| 国产亚洲精品日韩| 亚洲精品电影网在线观看| 色偷偷9999www| 高清欧美性猛交xxxx| 韩剧1988免费观看全集| 久久人人97超碰精品888| 97免费中文视频在线观看| 国产精品久久久久久一区二区| 亚洲福利在线视频| 日韩在线欧美在线国产在线| 18一19gay欧美视频网站| 亚洲精品久久久久久久久久久久| 亚洲一区二区少妇| 欧美肥老太性生活视频| 国模精品视频一区二区三区| 91在线播放国产| 成人欧美在线视频| 亚洲精品视频网上网址在线观看| 91精品久久久久| 91精品国产高清久久久久久久久| 亚洲精品福利资源站| 超碰97人人做人人爱少妇| 日韩av电影免费观看高清| 日韩精品在线观| 亚洲专区在线视频| 欧美一区二区三区图| 成人黄色免费片| zzijzzij亚洲日本成熟少妇| 亚洲资源在线看| 日本一区二三区好的精华液| 国产亚洲欧洲在线| 久久亚洲电影天堂| 成人福利视频网| 自拍视频国产精品| 久久久久久久久国产精品| 欧美精品激情blacked18| 琪琪亚洲精品午夜在线| 久色乳综合思思在线视频| 97av在线影院| 69av成年福利视频| 国产精品久久久久久av| 日日狠狠久久偷偷四色综合免费| 欧美丝袜一区二区三区| 国产成人亚洲综合| 亚洲xxx自由成熟| 中文字幕av一区二区| 色先锋久久影院av| 国产精品偷伦一区二区| 久久国产一区二区三区| 国产一区二区三区在线免费观看| 欧美福利视频在线| 精品国产一区久久久| 中文字幕日韩欧美在线| 91视频-88av| 欧美日韩一区二区免费在线观看| 国产精品美女网站| 国产91精品久久久| 亚洲一区精品电影| 成人午夜黄色影院| 91精品国产综合久久香蕉的用户体验| 欧美日韩国产在线播放| 精品国产电影一区| 亚洲韩国欧洲国产日产av| 国产性猛交xxxx免费看久久| 性色av一区二区三区免费| 高清日韩电视剧大全免费播放在线观看| 亚洲免费视频在线观看| 91精品免费久久久久久久久| 一道本无吗dⅴd在线播放一区| 亚洲欧美国产另类| 成人av在线亚洲| www.亚洲成人| 成人中文字幕+乱码+中文字幕| 在线电影av不卡网址| 国产噜噜噜噜噜久久久久久久久| 亚洲精选中文字幕| 成人午夜在线影院| 国产精品嫩草影院久久久| 日韩二区三区在线| 欧美综合在线第二页| 国内精久久久久久久久久人| 久久精品国产96久久久香蕉| 国产成人小视频在线观看| 国产精品91久久久久久| 国产精自产拍久久久久久| 日韩精品在线免费播放| 中文字幕av一区二区| 欧美黑人性视频| 亚洲精品99久久久久中文字幕| 国产精品99导航| 亚洲欧美综合图区| 一本色道久久综合狠狠躁篇的优点| 亚洲精品一区二三区不卡| 亚洲热线99精品视频| 国产欧美一区二区三区视频| 亚洲第一区中文99精品| 国产亚洲福利一区| 色综合影院在线| 久久视频在线播放| 色老头一区二区三区| 亚洲欧洲自拍偷拍| 国产日韩中文在线| 九九久久久久久久久激情| 亚洲一区二区日本| 亚洲自拍中文字幕| 国产精品入口免费视| 国产不卡在线观看| 97精品伊人久久久大香线蕉| 日韩免费观看高清| 国产专区欧美专区| 欧美极品少妇xxxxx| 免费97视频在线精品国自产拍| 久久中国妇女中文字幕| 国产精品爱久久久久久久| 亚洲成人xxx| 国产精品视频公开费视频| 97视频在线观看免费高清完整版在线观看| 91精品国产沙发| 精品国产一区二区在线| 国产美女91呻吟求| 国产一区av在线| 91久久精品视频| 日韩av在线网页| 国产噜噜噜噜久久久久久久久| 欧美做受高潮1| 国产精品久久一区主播| 久久99精品久久久久久琪琪| 欧美国产亚洲精品久久久8v| 欧美第一页在线| 欧美在线激情网| 欧美日本啪啪无遮挡网站| 欧美电影第一页| 欧美视频免费在线观看| 国产婷婷97碰碰久久人人蜜臀| 亚洲国产精品美女| 欧美日韩国产综合新一区| 热久久免费国产视频| 成人妇女免费播放久久久| 欧美日韩国产精品一区| 狠狠躁夜夜躁人人爽天天天天97| 国模叶桐国产精品一区| 日韩av在线直播| 中文字幕亚洲一区| 亚洲国模精品一区| 奇米四色中文综合久久| 亚洲国产精品va在线看黑人|