[Xarray] 1. 数据结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Xarray] 1. 数据结构相关的知识,希望对你有一定的参考价值。

参考技术A

参考 Xarray官方文档 , Python气象数据处理进阶之Xarray(1):Xarray的数据结构

在Xarray中,数据是由结构和标签的,分为以下几种:

1.DataArray:

带有标注或命名维度的多维数组。DataArray将metadata(例如:维名称,坐标和属性)添加到基础的 未标记 的数据结构,例如numpy和Dask数组。

2.Datasets:

具有类似字典结构的尺寸对其的DataArray对象的 集合 。因此,可以在单个DataArray的维度上执行的大多数操作都可以在Dataset上执行。

Dataset是多个DataArray的集合

3.Variable:

类似于NetCDF的变量。由dimensions,data和attributes组成。variable和numpy数组之间的主要功能区别在于,对variable的数字运算可以通过 维名称 实现数组广播。

通俗的讲,variables < DataArray < Dataset (<指包含于)。这种解释不完全正确,但是初学者可以这样理解。

Xarray通过对维命名的操作实现数据筛选和处理,实现数据的标记和命名通过以下几个定义实现:

* Dimension : 每一轴的维名称(e.g.,(\'x\',\'y\',\'z\'))。

* Coordinate : 坐标或刻度。类似于字典的序列,将每个点标记。比如说dimension是纬度,那么对应的coordinate就是纬度坐标(90°N,89°N,88°N……89°S,90°S)。

* Index : 索引号,也可以说是位置标号。a[0]代表a数组的一个数,0就是index。

可以看到,该文件是一个Datasets,里面含有变量:Data Variables,数据集的维度有经度纬度和时间,各自有各自的坐标Coordinates,同样数据集还有一些属性来表明数据集信息。

我们可以通过:

来分别查看数据集中包含的变量,维,坐标。

再比如NCEP的位势高度资料:

基本同上。

需要说明的是,ncl数据中存在short格式,在读取时需要使用short2flt()函数,但是在Python中不存在short格式,默认均为float,无需考虑这一点。

有时我们通过其他手段读取了相关数据,但是数据是np.array格式的,我们需要将其转换为DataArray,亦或我们需要输出一个NC文件,需要将计算后的数组转为DataArray格式,这就用到了创建的方法。

1.Data: 数据,可以是numpy ndarray,series,DataFrame,pandas.panel等格式

2.coords: 坐标列表或字典

如果是列表,则应为元组列表。其中第一个元素为dimension name,第二个元素是对应的坐标array_like对象。

用字典格式比较好

3.dims: 维名称列表

如果省略,并且coords是元组列表,则维度名称取自coords。

4.attrs: 属性

5.names: 变量名

以上,除了data外,都不是必须的。

创建示例如下:

上面提到,除了data以外,其他都是不必要的

如果是从一个DataFrame数据转化为DataArray的话(这种操作通常是为了将Pandas和Xarray联合使用):

会自动识别行列的名称和序号。

官方文档还有更复杂的例子,需要的话再去官网查看。

在创建了数据之后,我们同样可以使用相关的操作获取DataArray的各种信息:

如果想对DataArray的值修改可以通过以下两种方法:

两种结果是等价的,但官方只给出了第一种方法。

*通过指令 foo.rename(\'temperature\') 改名,比如通过hgt计算得到了一个新变量,需要改名,就可以用这个指令。

在得到一个DataArray后,用于画图时,比如我们需要获取它的经度和纬度(在这里,刚刚的例子是时间和高度),那么可以直接通过

这两种方式取出坐标信息。

要修改或者删除某坐标信息的话,原理和修改数据是一样的:

官网给出一个以气候数据为例的Dataset结构:

<center>

</center>

一个数据集,包含了数据主体(Temperature,Precipitation),维度坐标(latitude,longitude)。

根据官网的例子,一个Dataset是这样创建的,实际上与DataArray类似:

实际上这个例子与我们通常接触的不太一样,因为大部分数据的lat和lon都是一维的。

对Dataset的操作和DataArray基本一致,不再重复。

使用没有日期的时间作为 xarray 中的一维

【中文标题】使用没有日期的时间作为 xarray 中的一维【英文标题】:use time without date as one dimension in xarray 【发布时间】:2022-01-12 03:52:53 【问题描述】:

我有一个 xarray.DataArray,我成功地将一个暗淡设置为一天的时间。

tmp.dims
('ITEM', 'DATE', 'TIME', 'CODE')
tmp.TIME
<xarray.DataArray 'TIME' (TIME: 15)>
array([datetime.time(14, 15), datetime.time(14, 16), datetime.time(14, 17),
       datetime.time(14, 18), datetime.time(14, 19), datetime.time(14, 20),
       datetime.time(14, 21), datetime.time(14, 22), datetime.time(14, 23),
       datetime.time(14, 24), datetime.time(14, 25), datetime.time(14, 26),
       datetime.time(14, 27), datetime.time(14, 28), datetime.time(14, 29)],
      dtype=object)
tmp.TIME.values[0]
datetime.time(14, 15)

但我无法将此 xarray 保存到此错误中:

tmp.to_netcdf('/sdata/user/tsu/tmp/srpd.nc')
        *** ValueError: unable to infer dtype on variable 'TIME'; xarray cannot serialize arbitrary Python objects

这样使用datetime.time有错吗?

【问题讨论】:

欢迎堆栈溢出!请format python code as code blocks 不可执行 JavaScript sn-ps(我已经修复了它,所以不用担心),并且当询问错误时,请务必包含full traceback - 它们为我们调试提供了很多有用的信息。您可以使用 numpy 或 pandas 日期时间数组,而不是使用日期时间对象列表。查看pandas docs on working with time series data - 您可能正在寻找时间增量。 【参考方案1】:

不要使用 python datetime 对象的列表,而是使用来自 numpy 或 pandas 的 timedelta 数组。请参阅working with time series data 上的 pandas 文档。

对于按小时而不是特定日期索引的数据,我建议使用pd.to_timedelta,如下例所示:

In [9]: da = xr.DataArray(
   ...:     np.ones(16).reshape(4, 4),
   ...:     dims=['x', 'hour'],
   ...:     coords=[range(4), pd.to_timedelta(range(4), unit='h')],
   ...: )
   ...:

In [10]: da
Out[10]:
<xarray.DataArray (x: 4, hour: 4)>
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
Coordinates:
  * x        (x) int64 0 1 2 3
  * hour     (hour) timedelta64[ns] 00:00:00 01:00:00 02:00:00 03:00:00

In [11]: da.hour
Out[11]:
<xarray.DataArray 'hour' (hour: 4)>
array([             0,  3600000000000,  7200000000000, 10800000000000],
      dtype='timedelta64[ns]')
Coordinates:
  * hour     (hour) timedelta64[ns] 00:00:00 01:00:00 02:00:00 03:00:00

请注意,这可以毫无问题地写入 netCDF:

In [12]: da.to_dataset(name='myarr').to_netcdf('sample.nc')

In [13]: xr.open_dataset('sample.nc')
Out[13]:
<xarray.Dataset>
Dimensions:  (x: 4, hour: 4)
Coordinates:
  * x        (x) int64 0 1 2 3
  * hour     (hour) timedelta64[ns] 00:00:00 01:00:00 02:00:00 03:00:00
Data variables:
    myarr    (x, hour) float64 ...

【讨论】:

以上是关于[Xarray] 1. 数据结构的主要内容,如果未能解决你的问题,请参考以下文章

数据可视化应用xarray 绘图可视化-创建xarray对象&数据读取和转换&数据索引和分片&插值和广播(附代码)

总结 xarray 数据数组的列表

xarray中的查找表?

xarray - 返回满足特定条件的数据,而不必使用for循环

如何使用 xarray 沿时间维度扩展数据变量?

为啥 xarray 重新采样均值计算会产生额外的时间?