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