如何使用cfgrib加载typeOfLevel为unknown的GRIB变量及配置DWD自定义码表
配置自定义码表加载CLCL等DWD ICON变量的方法
方案1:配置DWD自定义ecCodes码表(推荐长期使用方案)
cfgrib依赖ecCodes库解析GRIB文件,配置自定义码表后可原生支持所有DWD ICON变量,操作步骤如下:
- 解压DWD提供的适配ecCodes的GRIB码表压缩包,得到
eccodes_definitions.edzw目录 - 配置ecCodes优先级加载路径,在运行Python代码前执行如下环境变量配置:
*注意:自定义码表路径必须放在系统默认路径之前,二者用冒号分隔。系统默认路径可通过运行# 替换为你本地解压后的自定义码表实际路径,以及系统默认ecCodes定义路径 export ECCODES_DEFINITION_PATH=/本地路径/eccodes_definitions.edzw:系统默认ecCodes定义路径codes_info | grep "Definitions path"命令查询获得 - 验证配置生效:重新执行
grib_ls命令查看CLCL变量,原输出中的unknown字段会变为正确的参数描述,说明码表配置成功 - 直接用xarray+cfgrib正常加载文件即可,CLCL变量会自动识别并加载:
import xarray as xr ds = xr.open_dataset("ICON_europe_reg_0.125x0.125_2021101900_f000.grib2", engine="cfgrib") print(ds.CLCL)
方案2:无需修改全局配置的替代方案
如果不想修改系统环境变量,可以选择以下临时方案:
- 方法一:指定cfgrib过滤参数强制加载
调用open_dataset时传入filter_keys指定需要读取的变量短名,强制cfgrib直接匹配GRIB消息中的shortName字段:ds = xr.open_dataset( "ICON_europe_reg_0.125x0.125_2021101900_f000.grib2", engine="cfgrib", filter_keys={"shortName": "CLCL"} ) - 方法二:使用pygrib手动读取转换
直接用pygrib库匹配读取变量后手动转为xarray格式,无需适配码表:import pygrib import xarray as xr grb_file = pygrib.open("ICON_europe_reg_0.125x0.125_2021101900_f000.grib2") # 筛选CLCL变量的第一条消息 clcl_msg = grb_file.select(shortName="CLCL")[0] # 转为xarray DataArray clcl_da = xr.DataArray( clcl_msg.values, coords={ "latitude": clcl_msg.latitudes.flatten(), "longitude": clcl_msg.longitudes.flatten() }, dims=["latitude", "longitude"] ) grb_file.close() - 方法三:手动修改cfgrib变量映射规则,在cfgrib的本地配置中添加CLCL等变量的参数映射,该方案维护成本较高,仅适合少量自定义变量场景使用
内容的提问来源于stack exchange,提问作者Florian Brucker
相关产品推荐
相关产品推荐

