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

Posted

技术标签:

【中文标题】如何使用 xarray 沿时间维度扩展数据变量?【英文标题】:How do I expand a data variable along a time dimension using xarray? 【发布时间】:2022-01-19 01:13:30 【问题描述】:

我有一个 DataSet ds_object,看起来像这样:

ds_object
<xarray.Dataset>
Dimensions:    (time: 14392)
Coordinates:
* time       (time) datetime64[ns] 2021-08-28T00:00:02.14...
Data variables:
variable  .......

“变量”在哪里:

<xarray.DataArray 'variable' ()>
array(0., dtype=float32)
Attributes:
   units:      count

我正在尝试按时间扩展零维variable。因此,本质上,将“变量”从 0D 更改为 1D 数组,形状为(1, 14392)variable 将具有与“时间”相同的长度,但 variable 的奇异值重复了 14392 次。

我能够做到这一点:

variable = np.full((1,len(time)),variable)

这为variable 提供了我需要的形状,但由于某种原因,这会作为坐标变量返回到 ds_object:

ds_object = ds_object.assign(variable_new=(variable[0]))
print(ds_object)

<xarray.Dataset>
Dimensions: (time: 13164, variable_new: 13164)
Coordinates:
  * time                  (time) datetime64[ns] 2021-08-28T00:00:02.14...
  * variable_new          (variable_new) float32 0.0 0.0 ... 0.0
Data variables: (12/28)

为什么会这样?如何将 variable_new 作为新数据变量添加到 ds_object

【问题讨论】:

欢迎堆栈溢出!这看起来是一个很好的问题,但我似乎无法运行您的代码并获得相同的结果。你能确定你问题中的代码是minimal reproducible example吗? 【参考方案1】:

创建一个类似于您的虚拟数据集:

In [2]: ds = xr.Dataset(
   ...:     'variable': ((), 0),
   ...:     coords='time': pd.date_range('2021-08-28', periods=1000, freq='D'),
   ...: )

In [3]: ds
Out[3]:
<xarray.Dataset>
Dimensions:   (time: 1000)
Coordinates:
  * time      (time) datetime64[ns] 2021-08-28 2021-08-29 ... 2024-05-23
Data variables:
    variable  int64 0

In [4]: ds['variable']
Out[4]:
<xarray.DataArray 'variable' ()>
array(0)

我们可以使用xr.DataArray.expand_dims 将数组广播到一个新的维度:

In [11]: ds['variable'] = ds['variable'].expand_dims(time=ds.time)

In [12]: ds
Out[12]:
<xarray.Dataset>
Dimensions:   (time: 1000)
Coordinates:
  * time      (time) datetime64[ns] 2021-08-28 2021-08-29 ... 2024-05-23
Data variables:
    variable  (time) int64 0 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0

或者,您也应该能够使用xr.Dataset.assign 完成此任务:

In [16]: ds = ds.assign(variable=ds['variable'].expand_dims(time=ds.time))

【讨论】:

以上是关于如何使用 xarray 沿时间维度扩展数据变量?的主要内容,如果未能解决你的问题,请参考以下文章

Xarray合并两个具有不同维度长度的hdf5文件

如何将 xarray DataArray 与长度为 1 的维度与更大的数组对齐?

如何为 xarray 数据数组创建一个 numpy 数组?

如何在xarray中删除一个维度? [复制]

Python气象数据处理进阶之Xarray(6):数据重组与换形

总结 xarray 数据数组的列表