You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

近期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库不支持新格式。

    1. 用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
      
    2. 查看两个文件中的templateNumber、gridType、editionNumber字段,确认是否存在未被旧版库支持的新类型。
  • 更新pygrib与ecCodes依赖库
    旧版ecCodes可能未实现对新GRIB2格式的解析逻辑,直接升级到最新版本:

    1. 卸载旧版本:
      pip uninstall -y pygrib
      
    2. 安装最新版(优先用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:42:43