信盈达—您身边的嵌入式&人工智能专家
全国免费咨询热线:400-8788-909

深圳python培训怎么样

时间:2019-08-29 00:00:00 来源:信盈达 作者:信盈达

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

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

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

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

安装

安装之前需要对Anaconda第三方源进行一些配置,关于Anaconda的配置看这里:一文教你解决Python所有安装配置

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

conda install pygrib

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

conda install -c conda-forge pygrib

安装完成之后即可进行grib数据处理

数据读取

首先导入库

import pygrib

然后读取grib格式数据

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

获取文件中相关信息
深圳python培训
linux系统编程实训课程

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

打印文件中所有记录信息

for d in data:

    print(d)

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

.seek  跳到第几条记录

.tell   当前所在记录位置

.rewind  回到第一条记录

.read   读取指定个数记录

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

data[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 np

import matplotlib.pyplot as plt

from mpl_toolkits.basemap import Basemap

fig, ax = plt.subplots(figsize=(12, 9))

lons = temp.data()[2][0,:]

lats = temp.data()[1][:,0]

tc = np.array(temp.data()[0]) #- 273.15

lons, 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中包含了更多的命令说明和绘图示例。