使用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命令可正常执行:
但用pygrib读取生成的文件时,参数名显示为数字191而非WNISI:$ 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:$ 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添加自定义参数表
- 创建eccodes格式的自定义参数文件(如
local.param),内容示例:
格式说明:0 23 0 128 208 0 WNISI "WNI Storm Index" ??discipline category product param_table param type name description units - 将该文件放到eccodes的本地定义目录(conda环境下通常为
$CONDA_PREFIX/share/eccodes/definitions/grib2/local),或设置环境变量:export GRIB_DEFINITION_PATH=/path/to/your/custom/definitions:$GRIB_DEFINITION_PATH - 重新运行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
相关产品推荐
相关产品推荐

