189 8069 5689

python气象流函数 python 气象

Python气象数据处理与绘图(1):数据读取

python很多库支持了对nc格式文件的读取,比如NetCDF4,PyNio(PyNio和PyNgl可以看做是NCL的Python版本)以及Xarray等等。

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、成都小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了香坊免费建站欢迎大家使用!

我最初使用PyNio,但是由于NCL到Python的移植并不完全,导致目前远不如直接使用NCL方便,而在接触Xarray库后,发现其功能强大远超NCL(也可能是我NCL太菜的原因)。

安装同其它库一致:

我这里以一套中国逐日最高温度格点资料(CN05.1)为例,其水平精度为0.5°X0.5°。

可以看到,文件的坐标有时间, 经度,纬度,变量有日最高温

我们将最高温数据取出

这与Linux系统中的ncl_filedump指令看到的信息是类似的

Xarray在读取坐标信息时,自动将时间坐标读取为了datetime64 格式,这对我们挑选目的时间十分方便。Xarray通常与pandas配合使用。

比如我们想选取1979.06.01-1979.06.20时期数据,我们只需

再比如我们想选取夏季数据时,只需

更多的时间操作同python的datetime函数类似。

当我们想选取特定经纬度范围(高度)的数据时,.loc[]函数同样可以解决。

在这里,我选取了40°N-55°N,115°E-135°E范围的数据

甚至,我们还可以套娃,同时叠加时间和范围的选取

这足够满足常用到的数据索引要求。

对于这类简单排列的.txt文件,可以通过np.load读取,用pandas的.read_csv更为方便

读取txt的同时,对每列赋予了一个列名,通过data.a可以直接按列名调用相应数据。

对于较复杂的.txt文件,仍可通过该函数读取

skiprows=5跳过了前5行的文件头,sep='\s+'定义了数据间隔为空格,这里用的是正则表达。

pd.read_csv函数有很多的参数,可以处理各种复杂情况下的文本文件读取。

grib文件可通过pygrib库读取

import pygrib

f = pygrib.open('xxx.grb')

Python气象数据处理进阶之Xarray(7):读写文件

前几文主要讲的是如何处理Xarray中的DataArray和DataSet,现在分享一下如何从nc文件或其他文件中读取数据,以及如何将处理好的数据输出成一个nc文件。

首先还是要再强调DataArray和DataSet的区别,DataArray是一个带标签结构的数组,DataSet是一个数据集,这意味着,从一个nc文件中读取到的全部信息构成了一个DataSet,而nc文件中的某一个变量是一个DataArray。

反之,我们要将一个数据写成nc文件,那么就是要创建一个DataSet。

这个数据结构有点像站点数据,对xy维设定了两层,分别是经纬度,还有一维时间维(whatever,反正是随便创建一个DataSet)。

就可以输出成nc文件了。

当然还可以更懒一点,

直接将abc这个DataArray转成DataSet,DataArray的标签和纬度信息会自动转换。

之后使用to_netcdf即可。

读取的语句也十分简单。

函数只需要基本的路径及文件名,无需像NCL一样声明状态'r'。

Xarray读取多文件也提供了相应函数(我目前没有使用过,我通常都是使用CDO提前处理,大家可以自行尝试)。

根据官方的介绍,Xarray也支持grib文件的读取。

前提是需要一个解码库"eccodes"

或者利用Xarray借助PYNIO去读。

官方文档中还有一部分是关于画图的,然而画图部分个人认为使用matplotlib+cartopy的组合更加灵活,因此Xarray系列到这里应该就完结了。

下一步的计划是按照魏凤英老师的统计方法一书,试着将常用的气象统计方法利用python去实现,但是水平实在有限。

Python气象数据处理与绘图(2):常用数据计算方法

对于气象绘图来讲,第一步是对数据的处理,通过各类公式,或者统计方法将原始数据处理为目标数据。

按照气象统计课程的内容,我给出了一些常用到的统计方法的对应函数:

在计算气候态,区域平均时均要使用到求均值函数,对应NCL中的dim_average函数,在python中通常使用np.mean()函数

numpy.mean(a, axis, dtype)

假设a为[time,lat,lon]的数据,那么

需要特别注意的是,气象数据中常有缺测,在NCL中,使用求均值函数会自动略过,而在python中,当任意一数与缺测(np.nan)计算的结果均为np.nan,比如求[1,2,3,4,np.nan]的平均值,结果为np.nan

因此,当数据存在缺测数据时,通常使用np.nanmean()函数,用法同上,此时[1,2,3,4,np.nan]的平均值为(1+2+3+4)/4 = 2.5

同样的,求某数组最大最小值时也有np.nanmax(), np.nanmin()函数来补充np.max(), np.min()的不足。

其他很多np的计算函数也可以通过在前边加‘nan’来使用。

另外,

也可以直接将a中缺失值全部填充为0。

np.std(a, axis, dtype)

用法同np.mean()

在NCL中有直接求数据标准化的函数dim_standardize()

其实也就是一行的事,根据需要指定维度即可。

皮尔逊相关系数:

相关可以说是气象科研中最常用的方法之一了,numpy函数中的np.corrcoef(x, y)就可以实现相关计算。但是在这里我推荐scipy.stats中的函数来计算相关系数:

这个函数缺点和有点都很明显,优点是可以直接返回相关系数R及其P值,这避免了我们进一步计算置信度。而缺点则是该函数只支持两个一维数组的计算,也就是说当我们需要计算一个场和一个序列的相关时,我们需要循环来实现。

其中a[time,lat,lon],b[time]

(NCL中为regcoef()函数)

同样推荐Scipy库中的stats.linregress(x,y)函数:

slop: 回归斜率

intercept:回归截距

r_value: 相关系数

p_value: P值

std_err: 估计标准误差

直接可以输出P值,同样省去了做置信度检验的过程,遗憾的是仍需同相关系数一样循环计算。


网页名称:python气象流函数 python 气象
URL链接:http://cdxtjz.cn/article/hjijoj.html

其他资讯