暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

气海无涯 2021-06-06
5737

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

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

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

生成.nc文件

ds = xr.Dataset({'prec': (('xy', 'time'), np.random.rand(4, 5))},coords={'lat': ('xy', [15, 25, 35, 45]),
                                                                         'lon': ('xy', [15, 25, 35, 45]),                                                                         'time': pd.date_range('2000-01-01', periods=5),})
print(ds)
#<xarray.Dataset>
#Dimensions: (time: 5, xy: 4)
#Coordinates:
# lat (xy) int64 15 25 35 45
# lon (xy) int64 15 25 35 45
# * time (time) datetime64[ns] 2000-01-01 2000-01-02 ... 2000-01-05
#Dimensions without coordinates: xy
#Data variables:
# prec (xy, time) float64 0.3666 0.004261 0.2313 ... 0.4544 0.9248 0.5594


复制

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

ds.to_netcdf('output.nc')

复制

就可以输出成nc文件了。
当然还可以更懒一点,

ds = xr.Dataset({'abc': abc})

复制

直接将abc这个DataArray转成DataSet,DataArray的标签和纬度信息会自动转换。
之后使用to_netcdf即可。

读取.nc文件

读取的语句也十分简单。

ds = xr.open_dataset('ds.nc')

复制

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

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

xr.open_mfdataset('my/files/*.nc', parallel=True)

复制


复制

读取GRIB文件

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

ds_grib = xr.open_dataset('example.grib', engine='cfgrib')

复制

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

conda install -c conda-forge eccodes

复制

或者利用Xarray借助PYNIO去读。

conda install -c conda-forge pynio
ds_grib = xr.open_dataset('example.grib', engine='pynio')

复制

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

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

文章转载自气海无涯,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论