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

使用wgrib2制作自定义参数WNISI的GRIB2文件时的参数冲突问题

问题描述

使用wgrib2制作含自定义参数(WNISI)的GRIB2文件时遇到两类问题:

  • wgrib2识别自定义参数失败:按规范创建本地参数表my_grib2table,内容如下:
    0:23:0:255:253:7:1:208:WNISI:WNI Storm Index:??
    
    设置环境变量export GRIB2TABLE=./my_grib2table后,执行wgrib2 out.grib -set_var WNISI -grib out.grb报错:
    $ wgrib2 out.grib -set_var WNISI -grib out.grb
    
    *** FATAL ERROR: set_var: could not find WNISI ***
    
  • pygrib读取参数名异常:将表中参数字段(208)改为190/191后,wgrib2命令可正常执行:
    $ wgrib2 out.grib -set_var WNISI -grib out.grb
    1:0:d=2022071400:WNISI:0 mb:6 hour fcst:
    2:179:d=2022071400:WNISI:0 mb:12 hour fcst:
    
    但用pygrib读取生成的文件时,参数名显示为数字191而非WNISI:
    $ python
    Python 3.10.5 | packaged by conda-forge | (main, Jun 14 2022, 07:06:46) [GCC 10.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import pygrib
    >>> grbs = pygrib.open("out.grb")
    >>> for grb in grbs:
    ...     print(grb.parameterName)
    ... 
    191
    191
    
解决方案

1. 修复wgrib2无法识别WNISI的问题

wgrib2的自定义参数表字段需严格匹配官方定义格式,表行格式为discipline:category:product:param_tbl:param:level_tbl:level:forecast_units:name:desc:units,问题出在param_tbl(第5个字段)设置为253——该编号为预留值,wgrib2无法通过它索引自定义参数。

修改方案:

  • 将param_tbl改为128(GRIB2标准本地自定义表编号),保持param为208,修改后的my_grib2table内容:
    0:23:0:128:208:7:1:208:WNISI:WNI Storm Index:??
    
  • 重新设置环境变量并执行wgrib2命令,此时-set_var WNISI可正常识别参数。

2. 修复pygrib读取参数名异常的问题

pygrib依赖ECMWF的eccodes库,默认仅加载标准GRIB参数表,不会读取wgrib2的本地表,因此无法映射自定义参数名。提供两种解决方法:

方法一:给eccodes添加自定义参数表

  1. 创建eccodes格式的自定义参数文件(如local.param),内容示例:
    0 23 0 128 208 0 WNISI "WNI Storm Index" ??
    
    格式说明:discipline category product param_table param type name description units
  2. 将该文件放到eccodes的本地定义目录(conda环境下通常为$CONDA_PREFIX/share/eccodes/definitions/grib2/local),或设置环境变量:
    export GRIB_DEFINITION_PATH=/path/to/your/custom/definitions:$GRIB_DEFINITION_PATH
    
  3. 重新运行pygrib脚本,即可正确读取parameterName为WNISI。

方法二:代码内手动映射参数ID

若不想修改系统参数表,可在pygrib代码中添加参数ID与名称的映射:

import pygrib

grbs = pygrib.open("out.grb")
# 替换为你实际使用的param编号和对应名称
param_mapping = {208: "WNISI"}

for grb in grbs:
    print(param_mapping.get(grb.parameterNumber, grb.parameterName))

内容的提问来源于stack exchange,提问作者Masako YAMADA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:15:41