Windows下xarray+cfgrib读取grib文件

在Windows下读取grib文件,在我上一篇博客Windows上python读取grib2文件(不用Linux)学习了使用wgrib2处理grib2文件,可以直接读,也可以转化为nc文件(转化后python就容易处理了)。而对于grib文件,下载wgrib处理可以,但不能转化为nc文件。本博客学习使用xarray和cfgrib读取及转化grib数据

一、气象数据常用格式

常用的数据格式包括普通的二进制格式、文本数据、NetCDF、HDF4/5以及GRIB1/2数据。这里简单介绍一下NetCDF和GRIB1/2数据。

1.NetCDF(Network Common Data Form)

NetCDF数据是常用的气象和卫星数据存储的数据格式,结构形式包含维数、变量、属性和数据四个子域。这里介绍一下如何使用python处理NetCDF数据:

pip install netCDF4  #安装处理NetCDF的依赖库
from netCDF4 import Dataset
import numpy as np

nc_obj = Dataset('C:\\wgrib2\\test.nc')
#查看nc文件
print(nc_obj)
print('---------------------------------------')

#查看nc文件中的变量
print(nc_obj.variables.keys())
for i in nc_obj.variables.keys():
    print(i)
print('---------------------------------------')

# 查看每个变量的信息
for i in nc_obj.variables.keys():
    print("---------------------------------")
    print(nc_obj.variables[i])
print('---------------------------------------')

# 查看每个变量的所有属性
for i in nc_obj.variables.keys ():
    print(nc_obj.variables[i].ncattrs())
print('---------------------------------------')

# 查看每个变量的单位
for i in nc_obj.variables.keys():
    print(nc_obj.variables[i].units)
print('---------------------------------------')

# 查看每个变量的维数
for i in nc_obj.variables.keys():
    print(nc_obj.variables[i].ndim)
print('---------------------------------------')

2.GRIB1和GRIB2文件

GRIB(GRIdded Binary)和GRIB2(General Regularly-distributed Information in Binary Form)是与计算机无关的压缩的二进制编码,主要用来存放数值天气分析和预报产品资料。处理grib文件的常用工具包pygrib,Grib格式数据处理有详细介绍,gribapi也自带python接口,可以通过ECMWF提供的ecCodes或cgrib安装包进行安装使用。此外利用wgrib以及wgrib2命令行工具也可以高效处理grib文件。

###wgrib2命令行
wgrib2 -d 56 a.grb2 -netcdf a.nc ###将grib文件转位nc文件
wgrib2 a.grb2 -d 1 -s -lon 249 39 -lon 255 33 ###提取过后经纬度点的数值

可以参考Windows上python读取grib2文件(不用Linux)

###利用xarray和cfgrib直接读取为数组
import xarray as xr
ds = xr.open_dataset('era5-levels-members.grib', engine='cfgrib')

这是本博客主要介绍的内容。

二、xarray+cfgrib读取grib文件

1.安装

首先我们这里主要使用2个Python库:

  1. xarray
  2. cfgrib

这里安装推荐使用conda安装,可以参考Windows下Anaconda的下载,安装与使用。

建议:Anaconda创建新的环境,在新的环境下安装以下依赖库,在新的环境下执行python文件。

conda install xarray
conda install cfgrib

如果想使用xarray读取grib文件,还需要一个解码库"eccodes":

conda install -c conda-forge eccodes

如果安装完ecodes库,提示找不到,则需要先引入这个库,请参考安装eccodes运行代码出错解决

2.xarray介绍

数据结构 :xarray有两大数据类型:DataArray、Dataset。

DataArray

一个带有标签的多维数组,它有如下几个重要的属性:

  1. values 获取数组的具体数值
  2. dims 获取维度的名字,如(‘x’, ‘y’, ‘z’)
  3. coords 获取一个类似于字典的结果,里面包含各个坐标
  4. attrs 获取原始数据的属性,比如变量的名字、单位等

Dataset

Dataset可以简单的理解为由多个DataArray组成的集合,它有如下几个重要的属性:

  1. dims 获取维度的名字,结果类似于字典,如{‘x’: 6, ‘y’: 6, ‘time’: 8}
  2. data_vars 获取物理量的名字
  3. coords 获取一个类似于字典的结果,里面包含各个坐标
  4. attrs 获取原始数据的属性,比如变量的名字、单位等

数据类型的使用

读取数据:

 xarray.open_dataset()读取Dataset类型数据,即能读取多个物理量。
 xarray.open_dataarray()读取DataArray类型数据,即只能读取单个物理量。

如果nc文件中含有多个物理量,用open_dataarray()读取会报错,因此建议统一都用open_dataset()来读取文件。

提取物理量

从文件中读取数据ds = xarray.open_dataset()

假如数据中含有一个名为var的物理量可以通过ds.var或ds[var]来获取。

3.实例使用

直接读取grib文件:

import xarray as xr
filein = 'F:/Zhu/download/2000-2015/FNL/FNL2000/fnl_20000505_00_00'
data = xr.open_dataset(filein, engine='cfgrib')
print(data)

运行出错:

Windows下xarray+cfgrib读取grib文件_第1张图片
可以看到:

cfgrib.dataset.DatasetBuildError: multiple values for key 'typeOfLevel'

这是因为目前cfgrib库无法同时读取多个typeOfLevel,因此我们只需要根据提示筛选我们需要的数据就行了。原程序添加所需数据为:

data = xr.open_dataset(filein, engine='cfgrib', backend_kwargs={'filter_by_keys':{'typeOfLevel': 'isobaricInhPa'}})

选择需要的typeOfLevel即可。
Windows下xarray+cfgrib读取grib文件_第2张图片
可以看到气压层有很多,这里也可以指定气压层:

data = xr.open_dataset(filein, engine='cfgrib', backend_kwargs={'filter_by_keys':{'typeOfLevel': 'isobaricInhPa','level':500}})

指定level为500,即读取500hpa气压层的数据。

Windows下xarray+cfgrib读取grib文件_第3张图片
同时,还可以直接将grib数据转化为nc文件:

data.to_netcdf('output.nc')

这里需要下载新的依赖库,根据提示缺少哪个库下载哪个库。

转化为nc文件后,可以继续使用读取nc文件的方法处理。

希望本博客对需要的同学有帮助,有问题的话可以互相讨论。

你可能感兴趣的:(Python,python,xarray+cgrib,eccodes)