爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 9027|回复: 8

[经验总结] windows下Python读取grib数据

[复制链接]

新浪微博达人勋

发表于 2022-4-9 22:37:14 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

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')
出错了:
download.png
原来是有多个层的数据,也就是有变量是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文件了。其他就不多说了,香喷喷的享用吧。


密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2022-4-9 23:59:44 来自手机 | 显示全部楼层
xr cfgrib 报错的话 可以根据错误提示的变量序号 在读取时根据key筛选报错的变量
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 成长值: 0
发表于 2022-4-10 00:09:52 | 显示全部楼层
本帖最后由 方小鲸 于 2022-4-10 00:21 编辑

本来想说第二种 xarray 的方法,试试读取时把引擎改为 pynio,比如

  1. ds = xr.open_dataset(filepath, engine="pynio")
复制代码


在自己的线上平台上(ModelWhale)上看到大家读取 FNL 的 grib2 文件时这种用法比较多。但是倒回去看你开头提到的是 Windows,gg,pynio 貌似在 windows 上用的话只能上子系统。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-2-26 18:32:55 | 显示全部楼层
conda install -c conda-forge cfgrib
conda install -c conda-forge eccodes

在windows上总是安装失败
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-2-26 20:24:30 | 显示全部楼层
wenbinz 发表于 2023-2-26 18:32
conda install -c conda-forge cfgrib
conda install -c conda-forge eccodes

conda install eccodes -c conda-forge
conda install python-eccodes -c conda-forge
conda install -c conda-forge cfgrib
conda install python-eccodes -i https://pypi.tuna.tsinghua.edu.cn/simple


试试这么装,多装几次,总能成功
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-4-7 11:36:35 | 显示全部楼层
第二环境加第三简直香炸了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-4-7 16:25:35 | 显示全部楼层
wenbinz 发表于 2023-2-26 18:32
conda install -c conda-forge cfgrib
conda install -c conda-forge eccodes

主要是安装eccodes要小心,要用conda装了eccodes之后,还要装一个eccodes的python binding
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-2-29 11:15:46 | 显示全部楼层
win11 下搞定了,非常感谢!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-4-15 10:46:14 | 显示全部楼层
非常感谢楼主分享
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表