在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 npnc_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库:
- xarray
- 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
一个带有标签的多维数组,它有如下几个重要的属性:
- values 获取数组的具体数值
- dims 获取维度的名字,如(‘x’, ‘y’, ‘z’)
- coords 获取一个类似于字典的结果,里面包含各个坐标
- attrs 获取原始数据的属性,比如变量的名字、单位等
Dataset
Dataset可以简单的理解为由多个DataArray组成的集合,它有如下几个重要的属性:
- dims 获取维度的名字,结果类似于字典,如{‘x’: 6, ‘y’: 6, ‘time’: 8}
- data_vars 获取物理量的名字
- coords 获取一个类似于字典的结果,里面包含各个坐标
- 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)
运行出错:
可以看到:
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即可。
可以看到气压层有很多,这里也可以指定气压层:
data = xr.open_dataset(filein, engine='cfgrib', backend_kwargs={'filter_by_keys':{'typeOfLevel': 'isobaricInhPa','level':500}})
指定level为500,即读取500hpa气压层的数据。
同时,还可以直接将grib数据转化为nc文件:
data.to_netcdf('output.nc')
这里需要下载新的依赖库,根据提示缺少哪个库下载哪个库。
转化为nc文件后,可以继续使用读取nc文件的方法处理。
希望本博客对需要的同学有帮助,有问题的话可以互相讨论。