使用 cfgrib 加载具有“未知”typeOfLevel 的 GRIB 变量

Posted

技术标签:

【中文标题】使用 cfgrib 加载具有“未知”typeOfLevel 的 GRIB 变量【英文标题】:Load GRIB variables with "unknown" typeOfLevel using cfgrib 【发布时间】:2021-12-09 03:28:30 【问题描述】:

我正在尝试使用 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 和#213 中读到这可能是由于使用了本地代码,并且我可能能够使用适当的代码表来解决问题。 DWD 确实提供了GRIB tables for ecCodes,但我不确定如何将它们与cfgrib 结合使用。

如何将自定义代码表与cfgrib 一起使用?还是有其他方法可以加载这些变量?

【问题讨论】:

【参考方案1】:

在没有进一步了解之后,我发布了相同的问题as an issue in the cfgrib GitHub project,并在那里得到了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。

【讨论】:

以上是关于使用 cfgrib 加载具有“未知”typeOfLevel 的 GRIB 变量的主要内容,如果未能解决你的问题,请参考以下文章

将二进制文件加载到未知结构类型

Webpack 配置具有未知属性“preLoaders”

收到内存警告的未知原因

JS 数据表 |获取数据时出现未知警告

使用具有未知数量的方法调用的 OCMock

未知错误:由于未知错误导致页面崩溃,会话被删除:无法从 ChromeDriver Selenium 崩溃的选项卡中确定加载状态