跳到主要内容

前言

在使用 anaconda 的 base 的环境中,使用 cfgrib 和 xarray 读取 grib 文件会比较困难。

这时可以通过创建一个虚拟环境来解决问题。

创建一个虚拟环境

在 anaconda Prompt 下(建议管理员打开)输入以下

conda create --name [envname] {python=x.x.x}

[] 是你虚拟环境的名字,是这个虚拟环境的 python 版本

是不必要的

激活虚拟环境

你可以在控制台下输入

conda info -e

来查看你现有的环境

激活环境需要输入

conda activate [envname]

关闭环境

conda deactivate [envname]

删除环境

conda remove --name [envname] --all

然后安装需要的包

在激活环境之后,你会看到命令行左边有个括号,里面有你的环境的名字

这时就可以安装包了

在 win 读取 grib 文件需要 cfgrib,xarray

把它转成 nc 文件则需要 netCDF4

注意,不需要自己安装 eccodes,在你安装 cfgrib 时他会自己安装 eccodes,且这时候环境里是没有 python 的,你可以自己先下好 python

也可以直接下载包,他会把最新的 python 下载下来

conda install xarray
conda install -c conda-forge cfgrib
python -m cfgrib selfcheck
conda install netCDF4 

或者 (上面命令失败的时候)

conda install -c conda-forge netcdf4

有可能漏掉某个包,不过缺啥下啥

读取 grib 文件并转成 nc 文件

命令行输入 python 进入 python 编程界面

import xarray as xr
import cfgrib
ds=xr.open_dataset("yourgrib_path",engine='cfgrib')
ds.to_netcdf('yournc_path')

这样就可以把 grib 文件转成 nc 文件,转成 nc 文件不是必需的,我比较习惯去读取 nc 文件

nc 文件相较于 grib 文件最直观的缺点就是,太大了。

读取 grib 时遇到的问题及解决方法

在读取多层 grib 文件的时候会遇到以下的报错的内容:

具体示例在:https://gitee.com/linziyang233/pythonlianxi/blob/main/%E6%95%B0%E6%8D%AE/%E8%AF%BB%E5%8F%96grib%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98.ipynb

DatasetBuildError:multiple values for unique key, try re-open the file with one of:
filter_by_keys={'stepType': 'avgid'}
filter_by_keys={'stepType': 'avgua'}
filter_by_keys={'stepType': 'avgas'}
filter_by_keys={'stepType': 'avgad'}

遇到这个问题可以安装 meteva 这个库

pip install meteva

然后

import xarray as xr
import cfgrib
import meteva.base as meb
# lands=xr.open_dataset('./data/land_monthly.grib',engine='cfgrib',)
# lands
meb.print_grib_file_info('./data/land_monthly.grib')

会有以下的信息

Output exceeds the size limit. Open the full output data in a text editor*************************************************************************
使用参数 filter_by_keys = {'stepType': 'avgid'}查看到的数据内容为:
<xarray.Dataset>
Dimensions: (time: 492, latitude: 41, longitude: 31)
Coordinates:
number int32 ...
* time (time) datetime64[ns] 1980-01-01 1980-02-01 ... 2020-12-01
step timedelta64[ns] ...
surface float64 ...
* latitude (latitude) float64 26.0 25.9 25.8 25.7 ... 22.3 22.2 22.1 22.0
* longitude (longitude) float64 109.0 109.1 109.2 ... 111.8 111.9 112.0
valid_time (time) datetime64[ns] ...
Data variables:
u10 (time, latitude, longitude) float32 ...
v10 (time, latitude, longitude) float32 ...
d2m (time, latitude, longitude) float32 ...
t2m (time, latitude, longitude) float32 ...
sp (time, latitude, longitude) float32 ...
Attributes:
GRIB_edition: 1
GRIB_centre: ecmf
GRIB_centreDescription: European Centre for Medium-Range Weather Forecasts
GRIB_subCentre: 0
Conventions: CF-1.7
institution: European Centre for Medium-Range Weather Forecasts
...
filter_by_keys = {'stepType': 'avgid'}
filter_by_keys = {'stepType': 'avgua'}
filter_by_keys = {'stepType': 'avgas'}
filter_by_keys = {'stepType': 'avgad'}

由上面的信息可以看到:每个“stepType“都要一些变量,所以== stepType:avgid{'stepType': 'avgid'} == 部分就是解决读取多层变量的 grib 文件的关键。

接下来在读取函数加上

** backend_kwargs= filterbykeys:stepType:avgid{'filter_by_keys':{'stepType': 'avgid'}} **

lands=xr.open_dataset('./data/land_monthly.grib',engine='cfgrib',backend_kwargs={'filter_by_keys':{'stepType': 'avgid'}})
lands

就可以读取到 avgid 下面的变量:u10,v10,d2m 这些。