xarray+cfgrib读取grib2文件问题-已解决
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xarray+cfgrib读取grib2文件问题-已解决相关的知识,希望对你有一定的参考价值。
参考技术A 初学python,利用conda构造cfgrib_env环境后,依次安装xarray、eccodes、cfgrib,尝试读取模式预报数据,cfgrib.bindings.TGribInternalError出现错误“End of resource reached when reading message (-45)”,cfgrib.dataset.DatasetBuildError出现错误“Key present and new value is different: key='heightAbove Ground' value=Variable(dimensions=(), data=2) new _value=Variable(dimensions=(), data=10)。问题待解决。
--------------------------------------
经过1个小时的尝试,发现cfgrib.bindings.TGribInternalError是由于grib2文件自身长度问题,更换文件该问题消失;cfgrib.dataset.DatasetBuildError不会影响数据读取,附几种读取grib2文件的方法(笔者均已实现):
1. win环境下wgrib2.exe(原文: https://www.jianshu.com/p/58981634ac17 )
2. win环境下python+cfgrib+xarray——cfgrib用关键字提取grib2变量方法(原文: https://cloud.tencent.com/developer/article/1471285 )
3. shell环境下python+pygrib(原文: https://www.cnblogs.com/jiangleads/p/9705787.html )
将 NetCDF 转换为 GRIB2
【中文标题】将 NetCDF 转换为 GRIB2【英文标题】:Converting NetCDF to GRIB2 【发布时间】:2013-03-04 04:16:42 【问题描述】:我知道有像wgrib2 这样的软件可以将grib
和grib2
格式的文件转换为NetCDF
文件,但我需要另辟蹊径:从NetCDF
到grib2
,因为这里的当地气象局只能消费grib2
格式的网格化数据。
似乎一种解决方案可能是在 Python 中,使用NetCDF4-Python library(或其他)读取NetCDF
文件并使用pygrib 写入grib2
。
有没有更好的办法?
【问题讨论】:
【参考方案1】:经过更多研究,我最终使用了英国气象局的“Iris”包 (http://scitools.org.uk/iris/docs/latest/index.html),它可以读取 NetCDF 以及 OPeNDAP、GRIB 和其他几种格式,并允许保存为 NetCDF 或 GRIB。
基本上代码如下:
import iris
cubes = iris.load('input.nc') # each variable in the netcdf file is a cube
iris.save(cubes[0],'output.grib2') # save a specific variable to grib
但如果您的 netcdf 文件不包含足够的元数据,您可能需要添加它,您也可以使用 Iris 来添加它。这是一个完整的工作示例:
https://github.com/rsignell-usgs/ipython-notebooks/blob/master/files/Iris_CFSR_wave_wind.ipynb
【讨论】:
【参考方案2】:也可以使用气候数据运算符 (cdo's) 来完成任务 -https://code.zmaw.de/projects/cdo/wiki
但需要安装带有所有附加库的软件。
【讨论】:
哇,这看起来相当广泛。你曾经用它把 NetCDF4 转换成 GRIB2 吗? 这确实是最好的方法。在处理 netCDF 文件时,CDO 和/或 NCO 迟早会非常有用。它们快速可靠,保留元数据,免费且用途广泛。一旦你很好地学习了 CDO 和 NCO,就可以对网格文件进行任何操作。这两者是迄今为止处理网格文件的最完整的解决方案,无需编码(R、Python 更通用,但通常速度较慢)。 回复 Rich,GRIB2 输出可以通过使用 -f grb2 标志,完整命令见下文【参考方案3】:我知道上面提到了 CDO,但我认为给出完整的命令会很有用
cdo -f grb2 copy in.nc out.grb
【讨论】:
【参考方案4】:ECMWF 有一个基于命令行的工具来执行此操作:https://software.ecmwf.int/wiki/display/GRIB/grib_to_netcdf
【讨论】:
问题是关于 netcdf 到 grib,而不是 grib 到 netcdf 没错,但 N1B4 指出 ECMWF 有一个用于处理 grib/netcdf 的简洁工具集是正确的,尽管我相信 grib_api 刚刚被再次取代。以上是关于xarray+cfgrib读取grib2文件问题-已解决的主要内容,如果未能解决你的问题,请参考以下文章