使用 cfgrib 加载具有 "unknown" typeOfLevel 的 GRIB 变量
Load GRIB variables with "unknown" typeOfLevel using cfgrib
我正在尝试使用 xarray
和 cfgrib
从 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。
我正在尝试使用 xarray
和 cfgrib
从 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。