- 积分
- 861
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2011-12-5
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 tianxia 于 2022-4-9 22:51 编辑
Windows下用degrib软件或Panoply软件都可以打开浏览Grib数据文件,但是现在要用python读取grib文件,以便各种分析计算。
许多人用开源的Python发行版本Anaconda,已自带很多包,免去很多麻烦。其下的spyder、Jupyter享用起来都很香。
可是,可读取grib文件的包有些是没有windows版本,有些就是在Windows+Anaconda下容易安装失败或运行时出错。
(1)最初学到用gdal包读取grib文件。(如果懒的试验,则直接跳至第3、4条)
https://www.lfd.uci.edu/~gohlke/pythonlibs/ 网址下载对应自己电脑的gdal版本,pip安装即可。案例如下:
from osgeo import gdal
import pandas as pd
fp=r'F:/fcst_phy2m125.195801' #某个JRA55文件
#fp=r'F:/flxf01.gdas.197901.grb2' #某个CFSR文件
dataset = gdal.Open(fp)
ncol = dataset.RasterXSize # 东西网格数
nrow = dataset.RasterYSize # 南北网格数
six= dataset.GetGeoTransform() #数据起始点及间隔
lon=np.arange(six[0]+0.5*six[1],six[0]+0.5*six[1]+ncol*six[1],six[1])
lat=np.arange(six[3]+0.5*six[5],six[3]+0.5*six[5]+nrow*six[5],six[5])
band_num = dataset.RasterCount # 变量数量/栅格文件波段数
metadata=pd.DataFrame([])
for i in np.arange(1,band_num+1):
i=int(i)
band = dataset.GetRasterBand(i)
dic=band.GetMetadata()
sr=pd.Series(dic,name=i)
metadata=pd.concat([metadata,sr],axis=1) #汇总所有变量信息
metadata=metadata.T #metadata存储所有变量信息(缺点是有些变量信息缺失,需要与degrib软件或Panoply软件打开grib文件信息对照一下)
md=dataset.GetRasterBand(3).ReadAsArray() #提取第3个变量的格点数据
(2)xarray+cfgrib方法读取grib文件。(如果懒的试验,则直接跳至第3、4条)
由于cfgrib依赖ECMWF的ecCodes包,而ecCodes包容易与其他包冲突,所以需要在Anaconda Prompt下新建一个环境:
conda create -n cfgrib_env (环境名字自取即可,此处用“cfgrib_env”)
启动刚刚设定好的虚拟环境:
activate cfgrib_env
安装各种基本包:numpy, pandas, matplotlib, xarray,
安装spyder:conda install spyder #耗时长,漫长的等待。。。
安装cfgrib和eccodes:
conda install -c conda-forge cfgrib
conda install -c conda-forge eccodes
主要包安装完后,打开spyder开始测试:
import xarray as xr
fp=r'F:/flxf01.gdas.197901.grb2' #某个CFSR文件
ds = xr.open_dataset(fp, engine='cfgrib')
出错了:
原来是有多个层的数据,也就是有变量是3维以上的数据,需要过滤自己需要的层的数据:
ds = xr.open_dataset(fp, engine='cfgrib',filter_by_keys={'typeOfLevel': 'surface'})
还是有错误,不过检查ds,已经读出一些变量了。
要想分次读全部变量,可能还得加不同的过滤filter_by_keys,但我还不知道怎么根据错误提示修改,搜搜搜,无果,放弃。有些grib文件可以读取成功,跟grib文件内部结构有关。
(3)在cfgrib_env环境下用pygrib包读取grib数据
cfgrib_env环境安装见第2条,环境名字自取即可。
安装:conda install -c conda-forge pygrib 或pip install pygrib
运行测试:
import pygrib
fp=r'F:/flxf01.gdas.197901.grb2' #某个CFSR文件
grbs=pygrib.open(fp)
for grb in grbs:
print(grb) #输出变量信息
grb1=grbs.message(1) #此处1为变量序号
md=grb1.values #读取变量数据
md,lat,lon=grb1.data() #读取变量数据、经纬度信息
md1,_,_=grb1.data() #仅读取变量数据
md2, lat2, lon2 = grb1.data(lat1=20,lat2=70,lon1=220,lon2=320) #自定义经纬度范围,读取变量数据及经纬度信息
成功运行,真香!
(4)终极总结
前述方法,第3种方法中pygrib包读取方法最为理想。但是pygrib包在Anaconda的base环境下是安装失败的,只能在cfgrib_env环境下用,原因可能就是不同包之间的依赖冲突。这样的话,如果能清理掉冲突的包是最好的。所以我想到以下方案:
删掉Anaconda(用的多了,装的包也越来越多,越来越臃肿,早就想搞掉它了),改为安装Miniconda,轻量级,很干净,只装自己需要的包就可以了。https://docs.conda.io/en/latest/miniconda.html网址下载Miniconda的exe文件,安装好。
- 先在Anaconda Prompt(Miniconda3)下装好Navigator: conda install anaconda-navigator
- 通过navigator装spyder、Jupyter开发环境,然后在navigator里查找安装自己需要的包:numpy、pandas、matplotlib、xarray、cartopy、geopandas、gdal、、、、安装很顺畅...
- 在Anaconda Prompt下装pygrib:conda install -c conda-forge pygrib
- 如果需要也安装下cfgrib+eccodes试试(画蛇添足了)
conda install -c conda-forge cfgrib
conda install -c conda-forge eccodes
现在可以参考第3条测试pygrib包读取grib文件了。其他就不多说了,香喷喷的享用吧。
|
|