一、在Windows下Python為什么無法讀取GRIB
大家在windows系統不能讀取GRIB數據的主要原因是,GRIB_API在Windows下無法編譯安裝,從而導致pygrib安裝失敗。我曾經也為這個問題苦惱了很久,也到ECMWF論壇里找了很久,也給ECMWF發了郵件,回應我沒有做Windows版本的打算,所以在Windows下直接用pygrib讀取GRIB數據是基本不可能實現了。
二、Windows下間接讀取GRIB數據方法
后來通過大量的百度,還是找到了在Windows下讀取GRIB數據的方法:一種是在Cygwin中安裝pygrib,將pygrib的方法編譯成讀取GRIB的exe;另一種是通過一個第三方的程序wgrib2,先用wgrib2把數據讀存到txt,然后再用python讀取txt文件。
首先嘗試了Cygwin,pygrib成功編譯出了exe,但是無法運行,感覺Cygwin稍微復雜,所以我沒有繼續研究這一種方法,直接轉向第二種方法。
1.wgrib2
wgrib2是由NCEP開發的一個功能強大的命令行工具,用於讀取、創建和修改GRIB2文件。它是原有支持GRIB1編碼的wgrib程序的延續,可以完成GRIB2的編碼、解碼,插值、修改投影方式、修改經緯度范圍和要素提取等功能。wgrib2作為GrADS軟件包中的一個工具,用戶可以通過安裝GrADS獲得該軟件,也可以通過訪問它的官網獲得最新的源碼 進行編譯。由於新版的wgrib輸出數據之間沒有分隔符,所以我找了一個之前的版本,輸出后每個數據占一行。本文中使用的wgrib
- wgrib2命令參數
在cmd中直接運行wgrib.exe可得到如何使用的幫助信息。
Portable Grib decoder for NCEP/NCAR Reanalysis etc.
it slices, dices v1.7.3.1 (8-5-99) Wesley Ebisuzaki usage: /cygdrive/d/wgrib/wgrib [grib file] [options] Inventory/diagnostic-output selections ;輸出目錄或診斷結果 -s/-v short/verbose inventory ;簡短/詳細目錄 -V diagnostic output (not inventory ;輸入診斷 (none) regular inventory ;默認目錄 Options ;選項 -PDS/-PDS10 print PDS in hex/decimal ;輸出16/10進制PDS -GDS/-GDS10 print GDS in hex/decimal ;輸出16/10進制GDS -verf print forecast verification time ;輸出預測驗證時間 -ncep_opn/-ncep_rean default T62 NCEP grib table ;默認為T62_NCEP GRIB數據表 -yr print year using 4 digits ;輸出4位數字的年份 Decoding GRIB selection ;GRIB解碼選項 -d [record number|all] decode record number ;解碼指定編號數據 -p [byte position] decode record at byte position ;解碼所指定的二進制位置數據 -i decode controlled by stdin (inventory list) ;按目錄列表解碼 (none) no decoding ;不解碼 Options ;選項 -text/-ieee/-grib/-bin convert to text/ieee/grib/bin (default) ;將解碼數據轉換成text/ieee/grib/bin格式的數據 -nh/-h output will have no headers/headers (default) ;是否包含標題頭 -H output will include PDS and GDS (-bin/-ieee only) ;輸出是否包含PDS和GDS -append append to output file ;在輸出文件上添加而不是替換 -o [file] output file name, 'dump' is default ;輸出文件名
2.使用os.system
在Python中執行Windows命令行程序wgrib
import os os.system(os.path.abspath('.')+'\wgrib\wgrib.exe '+gribfilename+' -d 1 -text -nh -o '+outfilename)
這樣就可以在指定目錄找到輸出的txt文件
3.將txt文件中的數據轉換成數組
原數據是37*37的數組,而輸出的數據是每個數據占一行,所以需要進行一下轉換
f=open(outfilename,'r') grds=f.read().strip() grds=grds.split('\n') data= np.array(grds) data.resize(37,37) data= data.astype(float)
以上就是Windows下Python讀取GRIB數據的完整方法,希望可以幫到需要的朋友