使用 cfgrib 加载具有 "unknown" typeOfLevel 的 GRIB 变量

Load GRIB variables with "unknown" typeOfLevel using cfgrib

我正在尝试使用 xarraycfgrib 从 DWD 的 ICON 模型加载 GRIB2 文件。大多数变量工作正常,但对于某些变量(例如 CLCL),xarray.open_dataset 会引发以下错误:

Traceback (most recent call last):
  File "/shared/conda/envs/devtools/lib/python3.8/site-packages/xarray/core/dataset.py", line 1398, in _construct_dataarray
    variable = self._variables[name]
KeyError: 'CLCL'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "DAT-2634/grib_file_loaders.py", line 276, in <module>
    df_cfgrib_sf = read_cfgrib_sf(grib_fns, nodes, params)
  File "DAT-2634/grib_file_loaders.py", line 115, in read_cfgrib_sf
    x = xr.open_dataset(
  File "/shared/conda/envs/devtools/lib/python3.8/site-packages/xarray/core/dataset.py", line 1502, in __getitem__
    return self._construct_dataarray(key)
  File "/shared/conda/envs/devtools/lib/python3.8/site-packages/xarray/core/dataset.py", line 1400, in _construct_dataarray
    _, name, variable = _get_virtual_variable(
  File "/shared/conda/envs/devtools/lib/python3.8/site-packages/xarray/core/dataset.py", line 173, in _get_virtual_variable
    ref_var = variables[ref_name]
KeyError: 'CLCL'

当我通过 grib_ls 检查文件时,我得到

$ grib_ls ICON_europe_reg_0.125x0.125_2021101900_f000.grib2 | grep CLCL
2            edzw         20211019     fc           regular_ll   0            unknown      800          CLCL         grid_simple 

我已阅读 cfgrib#195 and #213 that this is probably due to the use of local codes and that I might be able to fix the issue using the appropriate code tables. DWD does provide GRIB tables for ecCodes,但我不确定如何将它们与 cfgrib 结合使用。

如何在 cfgrib 中使用自定义代码表?或者有其他方法加载这些变量吗?

在没有进一步了解之后,我在那里发布了同样的问题 as an issue in the cfgrib GitHub project, and got a response:解决方案是将自定义代码表的路径添加到 ECCODES_DEFINITION_PATH 环境变量中:

import os
from pathlib import Path
import xarray

ECCODES_DEFINITION_PATHS = [
    # The custom codes I want to use
    Path('path/to/the/custom/codes'),

    # The codes from my system's ecCodes installation
    Path('/usr/share/eccodes/definitions'),
]
os.environ['ECCODES_DEFINITION_PATH'] = ':'.join(
    str(p.resolve())
    for p in ECCODES_DEFINITION_PATHS
)

x = xarray.open_dataset(...)

有详细的文档可用 in the ECMWF wiki