上次我们说到了如何,这次我们说一下如何使用python处理grib格式数据。

Grib格式是一种应用于气象领域的简明数据格式,由世界气象组织进行标准化。通常用来存储历史气象数据。当前有3个版本的grib格式,版本0已经不再使用,版本1仍在广泛使用,主要用于存储数值天气输出结果。版本2的变化较小,目前也已经得到应用。

很多工具都可以处理grib格式数据,比如matlab中nctoolbox工具箱,python中的pygrib,ncepgrib2,PyNIO等。此外还有专门用于处理grib格式的命令行工具,比如wgrib,wgrib2分别用于读取grib和grib2格式。跨平台工具zyGrib可用于grib数据的可视化。还有NCL,MeteoInfo等等。

此次仅介绍如何使用Python处理grib格式数据,关于其他工具或编程语言的应用以后可能会单独讲解。由于pygrib,ncepgrib2和PyNIO等工具没有Windows版本,因此本文仅适用于Unix系统(Win10中的Linux子系统),不适用于Windows系统。

安装之前需要对Anaconda第三方源进行一些配置,关于Anaconda的配置看这里:

配置完成之后可以使用如下命令安装

conda install pygrib如果未进行第三方源配置,可使用如下方式安装

conda install -c conda-forge pygrib安装完成之后即可进行grib数据处理

数据读取

首先导入库

import pygrib

然后读取grib格式数据

data = pygrib.open('fnl__00_00.grib2')

获取文件中相关信息

data.messages    ## 表示文件中总共有多少条数据

打印文件中所有记录信息

for d in data:    print(d)

pygrib所提供的处理方式类似二进制数据处理,其提供了一些处理二进制数据的方法,比如.seek .tell  .rewind  .read等方法。

.seek  跳到第几条记录

.tell   当前所在记录位置

.rewind  回到第一条记录

.read   读取指定个数记录

除了上述方式外,还可以使用索引的方式获取文件中的记录,比如,想要获取第10条记录,可使用如下命令:

pygrib还提供一些方法通过变量名称和一些参数来获取相关记录信息,比如:

## 指定获取层的类型,可以选择获取指定类型层的数据,这对应了不同压力层的的数据data.select(name='Temperature', typeOfLevel='isobaricInhPa')

比如获取地面温度:

temp = data.select(name='Temperature', typeOfLevel='surface', level=0)[0]

返回的 temp 变量包含了一些方法和属性,比如 temp.data() 包含了温度数据以及经纬度信息,temp.latlons() 则包含了经纬度信息,temp.projparams 则包含了文件中的投影信息。还有一些其他属性和方法,具体见文末Jupyter Notebook。

以上述读取的温度数据为例,绘制中国及周边地区的温度分布:

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.basemap import Basemapfig, ax = plt.subplots(figsize=(12, 9))lons = temp.data()[2][0,:]lats = temp.data()[1][:,0]tc = np.array(temp.data()[0]) #- 273.15lons, lats = np.meshgrid(lons, lats)m = Basemap(projection=temp.projparams.get('proj'), lon_0=180, llcrnrlat=0, llcrnrlon=70, urcrnrlat=60, urcrnrlon=140, ax=ax)x, y = m(lons, lats)con = m.contourf(x, y, tc, np.arange(220, 321), cmap=plt.cm.RdBu_r)_ = m.ax.set_xlim([70, 140])_ = m.ax.set_ylim(0, 60)_ = m.drawparallels(np.arange(0, 61, 10), labels=[1,0,0,0], linewidth=0.1, fontsize=16, fmt=lat2str, dashes=[2,2])_ = m.drawmeridians(np.arange(70, 141, 15), labels=[0,0,0,1], linewidth=0.1, fontsize=16, fmt=lat2str, dashes=[2,2])_ = m.readshapefile('中国行政区_包含南海九段线', 'china', linewidth=1.5)

cb = fig.colorbar(con, pad=0.02, shrink=0.95)cb.set_ticks(np.arange(220, 321, 20))cb.set_ticklabels(np.arange(220, 321, 20))cb.ax.tick_params(labelsize=16)  ## 控制colorbar ticklables字体大小cb.ax.set_ylabel('Temperature($\circ$C)', fontdict=dict(family='Times New Roman', fontsize=24))  # set colorbar yaxis label font

文末链接中提供了所使用的数据和shp文件,其中也包含了Notebook,Notebook中包含了更多的命令说明和绘图示例。

数据处理及可视化下期:HDF格式数据处理及可视化

往期回顾