近期pygrib无法按经纬度范围获取ECMWF GRIB2数据问题咨询
解决pygrib读取ECMWF新GRIB2数据时的RuntimeError问题
此前使用以下代码可正常获取ECMWF实时预报的降雨数据:
import pygrib import numpy as np source='./10-Download-ECMWF/' grbs = pygrib.open(source+'10-data.grib2') grb2 = grbs.message(1) ### message start from 1, message 1=rainfall, mesage2=temp data, lats, lons = grb2.data(lat1=-10, lat2=20, lon1=90, lon2=130)
存档中的旧数据仍可正常使用,但2023年6月起下载的新数据执行第7行时抛出错误:
RuntimeError: b'Function not yet implemented'
以下是针对性的解决思路:
检查GRIB2数据编码格式变化
ECMWF在2023年中可能更新了GRIB2的编码规则(比如新增模板、更换压缩算法或网格投影类型),旧版pygrib依赖的ecCodes库不支持新格式。- 用ecCodes工具
grib_ls对比新旧数据的元信息:grib_ls -j ./10-Download-ECMWF/10-data.grib2 > new_data_meta.json grib_ls -j ./old_data_dir/old_data.grib2 > old_data_meta.json - 查看两个文件中的
templateNumber、gridType、editionNumber字段,确认是否存在未被旧版库支持的新类型。
- 用ecCodes工具
更新pygrib与ecCodes依赖库
旧版ecCodes可能未实现对新GRIB2格式的解析逻辑,直接升级到最新版本:- 卸载旧版本:
pip uninstall -y pygrib - 安装最新版(优先用conda管理依赖,避免编译问题):
# conda用户推荐 conda install -c conda-forge pygrib eccodes # pip用户需确保系统已安装ecCodes开发库(Linux可装libeccodes-dev) pip install --upgrade pygrib
- 卸载旧版本:
改用ecCodes原生Python API读取
如果更新pygrib后仍无法解决,可直接使用ecCodes的Python绑定绕过pygrib封装:import eccodes def extract_grib_subset(file_path, target_param_id, lat1, lat2, lon1, lon2): with open(file_path, 'rb') as f: while True: gid = eccodes.codes_grib_new_from_file(f) if gid is None: break # 匹配目标气象参数(示例:降雨的paramId为228,需根据实际数据调整) if eccodes.codes_get(gid, 'paramId') == target_param_id: # 设置经纬度子集范围 eccodes.codes_set(gid, 'latFirst', lat1) eccodes.codes_set(gid, 'latLast', lat2) eccodes.codes_set(gid, 'lonFirst', lon1) eccodes.codes_set(gid, 'lonLast', lon2) # 提取数据 data = eccodes.codes_get_array(gid, 'values') lats = eccodes.codes_get_array(gid, 'latitudes') lons = eccodes.codes_get_array(gid, 'longitudes') eccodes.codes_release(gid) return data, lats, lons eccodes.codes_release(gid) return None, None, None # 调用示例 data, lats, lons = extract_grib_subset('./10-Download-ECMWF/10-data.grib2', 228, -10, 20, 90, 130)验证新数据完整性
确保2023年6月后的新数据未下载损坏,可重新下载样本文件测试,或用grib_check命令校验:grib_check ./10-Download-ECMWF/10-data.grib2
内容的提问来源于stack exchange,提问作者Azam
相关产品推荐
相关产品推荐

