Python读取Grib数据:xarray与cfgrib安装及报错处理详解
本文详细介绍在Python中通过xarray搭配cfgrib库读取Grib数据的完整流程。重点讲解如何在独立conda环境中避免依赖冲突,解决Windows/Linux/MacOS跨平台兼容问题,并针对读取多typeOfLevel文件时常见的DatasetBuildError报错,提供基于filter_by_keys的具体代码修复方案。
环境准备与不推荐方案分析
在尝试安装任何用于处理Grib数据的Python库之前,强烈建议创建一个全新的虚拟环境进行安装。在base环境中直接安装往往会导致各种依赖冲突和报错。关于如何创建新环境的具体方法,可参考之前的总结或网络上的其他教程。
不推荐的方法
首先介绍两种不推荐的方案。第一种是pygrib库,它依赖于python2.4+、numpy、pyproj、Jasper以及GRIB_API。由于GRIB_API已于2020年6月30日正式被ecCodes取代,且该库主要依赖Linux或MacOS系统,因此目前不再推荐使用。第二种是GDAL,虽然它在Windows下安装相对简单,但需要借助wgrib2工具来查看Grib变量所在的通道,操作较为繁琐,故也不推荐。
推荐的解决方案
xarray与cfgrib安装步骤详解
推荐使用xarray搭配cfgrib库的组合方案。该方案的优势在于支持Linux、Windows和MacOS系统,且安装过程相对简单。强烈建议在所有所需库安装前,先创建一个独立的虚拟环境以确保依赖隔离。以下是具体的安装步骤:
第一步,创建新的conda环境。执行以下命令创建一个名为cfgrib_env的环境,并指定Python版本为3.7.0: conda creat -n cfgrib_env python=3.7.0
第二步,启动刚才创建的虚拟环境。在命令行中输入以下命令激活环境: source activate cfgrib_env
第三步,在激活的环境中安装spyder、xarray、eccodes、cfgrib以及其他必要的依赖库。安装方式可以选择pip或conda。需要注意的是,eccodes通常无需额外配置路径(尽管部分教程可能提及需要配置)。
第四步,在刚刚安装好的新环境中启动Spyder编辑器。如果在base环境或其他环境中启动Spyder,将无法正确调用新环境中的库,因此必须切换到安装路径并执行: ~/anaconda3/envs/cfgrib_env/bin$ ./spyder
第五步,编写读取Grib数据的Python代码。
代码实现与常见报错处理
import xarray as xr
import cfgrib
ds = xr.open_dataset('/1.grib2',engine='cfgrib')
在执行代码时,可能会遇到如下错误提示:
DatasetBuildError: multiple values for unique key, try re-open the file with one of:
filter_by_keys={'typeOfLevel': 'unknown'}
filter_by_keys={'typeOfLevel': 'surface'}
filter_by_keys={'typeOfLevel': 'isobaricInhPa'}
filter_by_keys={'typeOfLevel': 'meanSea'}
filter_by_keys={'typeOfLevel': 'depthBelowLandLayer'}
filter_by_keys={'typeOfLevel': 'heightAboveGround'}
filter_by_keys={'typeOfLevel': 'heightAboveGroundLayer'}
filter_by_keys={'typeOfLevel': 'tropopause'}
filter_by_keys={'typeOfLevel': 'maxWind'}
filter_by_keys={'typeOfLevel': 'heightAboveSea'}
filter_by_keys={'typeOfLevel': 'isothermZero'}
filter_by_keys={'typeOfLevel': 'pressureFromGroundLayer'}
filter_by_keys={'typeOfLevel': 'sigmaLayer'}
filter_by_keys={'typeOfLevel': 'sigma'}
filter_by_keys={'typeOfLevel': 'potentialVorticity'}
遇到此错误无需惊慌。这是因为当前的cfgrib库无法直接同时读取包含多个typeOfLevel(层级类型)的文件。解决方法是根据报错提示,筛选出我们所需的具体数据层级。在原程序基础上,需要添加相应的筛选参数,具体代码如下:
ds = xr.open_dataset('/1.grib2',engine='cfgrib',backend_kwargs=
{'filter_by_keys':
{
'typeOfLevel': 'surface'
}
}
)
筛选后的数据变量可通过ds.变量名的方式访问。
经过多日的调试与折腾,最终成功解决了问题,感觉轻松许多。
总结
至此,关于Python安装及读取Grib库的总结介绍完毕。如需了解更多相关内容,建议搜索本站过往文章或继续浏览后续文章。感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









