Python气象数据处理进阶之Xarray(5):数据整合(分组,合并...)

Python气象数据处理进阶之Xarray(5):数据整合(分组,合并...),第1张

这部分同pandas的gorupby函数基本相同,实现对数据的分组归类等等。

split·将数据分为多个独立的组。

apply·对各个组进行 *** 作。

combine·将各个组合并为一个数据对象。

创建一个dataset

我对官网的例子加以修改以便更好的理解。

解释下数据结构,创建了一个二维数据u(lat, lon),坐标数据为latitude 和country ,强调一下这里创建的是dataset,而不是dataArray,分不清的可以再看看本系列的第一篇文章。坐标数据不等于u的坐标。创建coords部分都指明了latitude 和 country 都是针对lat的扩展。

我们可以这样理解,对于纬度的分类,我们可以按纬度的大小分,也就是"latitude": [10, 20, 30, 40] ; 我们也可以对纬度所在的国家分,"country": ("x", list("abba") ,那比如我们想求某个国家的数据的平均时就十分方便。

下边我们进行分组:

说明第0和第4个数是国家a的,第2和第3是国家b的。

.groups换成.mean() 则就是对分组求平均,以此类推。

必须添加一个list才可以将其分类结果打印出来。直接打印DatasetGroupBy object是不能输出结果的。

那么针对经纬度的坐标的分组怎么实现呢,比如说选出区间在多少到多少之间的?

.groupby_bins() 函数可以解决这一问题。

还是这个数据,"latitude": [10, 20, 30, 40]

那我们想以25为界,分为两组,0-25,25-50

在进行了分组后,要对各个分组进行计算。

我们先从dataset 中取出 u 这个dataarray

比如是实现前边提到的按国家进行数据平均,或者标准化

也可以通过map()函数使用一些自定义的函数,比如说标准化,

这个用法是官方提供的,但是我的Xarray版本过低,还不支持这种用法(Xarray会定期更新,以至于可能我介绍过的一些方法有了更简便的 *** 作,大家可以在评论区留言)。

强调一句,Xarray官方的更新是比较快的,很可能我写在这里的函数官方又给出了更新的版本,但是我没办法做到时刻与官方最新同步,所以如果遇到问题,最好的解决办法还是去查阅官方文档的对应部分。

寒潮是笔者主要的研究方向,寒潮路径作为寒潮重要的特征,是寒潮预报的重点之一,同样的道理也适用在台风研究以及降水的水汽来源研究中。关于路径的计算以及获取方法(比如轨迹倒推,模型追踪等等方法,台风有自己现成的数据集,比如ibtracs数据集等等)并不在本文的介绍范围之内,本文主要介绍在获取了相应的路径坐标后,如何在图中美观的展现。

上图展现了近40年东北亚区域的冬季冷空气活动路径,绘制这类图需要的数据只需为每条路径的N个三维坐标点,第一第二维分别为longitude和latitudee,第三维则比较随意,根据需要选择,比如说需要体现高度,那就用高度坐标,需要体现冷空气强度,那就用温度数据,水汽可以用相对湿度,台风也可以用速度等等。

通常此类数据是由.txt(.csv)等格式存储的,读取和处理方法可参考我的“Python气象数据处理与绘图(1):数据读取”,本文主要介绍绘图部分。

当然根据需要,也可以直接绘制两维的轨迹,即取消掉颜色数组,用最简单的plot语句,循环绘制即可。

有一个陷阱需要大家注意的是,当轨迹跨越了东西半球时,即穿越了0°或者360°经线时,它的连接方式是反向绕一圈,比如下图所示,你想要蓝色的轨迹,然而很有可能得到绿色的,这是因为你的网格数组的边界是断点,系统不会自动识别最短路径,只会在数组中直接想连,因为这不是循环数组。

我目前的解决办法是这样的:如果你的数据是0°-360°格式,那么变为-180°-180°的格式,反之相互转换。但是如果你的数据两种都出现了断点,也就是绕了地球一圈多,那无论怎样都么得办法了,我目前的思路是将数据转换成极坐标数据格式,理论上是可行的,CARTOPY的绘图也是支持极坐标数据的,具体实施还需要再试试。

前几文主要讲的是如何处理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去实现,但是水平实在有限。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9422833.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存