xarray - 如何在多年内按 yyyy-01-01 和 yyyy-07-01 对时间序列数据进行分组或重新采样

xarray - how to group or resample time series data by yyyy-01-01 and yyyy-07-01 over multiple years

我的时间序列数据是一个名为 da_output_halfyearly:

的 xarray' DataArray 对象
<xarray.DataArray '__xarray_dataarray_variable__' (time: 10, latitude: 106, longitude: 193)>
dask.array<shape=(4, 106, 193), dtype=int32, chunksize=(2, 106, 193)>
Coordinates:
  * latitude   (latitude) float32 -39.2 -39.149525 ... -33.950478 -33.9
  * longitude  (longitude) float32 140.8 140.84792 140.89584 ... 149.95209 150.0
  * time       (time) datetime64[ns] 1972-01-01 1972-07-01 1973-01-01 1973-07-01 ... 1981-01-01 1981-07-01

我需要 group/resample 将数据分成两个时间组 "yyyy-01-01" 和 "yyyy-07-01" 并从每个组中的数据中取出 std()。

我能够使用索引选择将数据拆分为两个单独的 DataArray 对象:

da_all_jan_jun = da_output_halfyearly[::2]
da_all_jul_dec = da_output_halfyearly[1::2]

da_jan_jun_std = da_all_jan_jun.std(dim='time')
da_jul_dec_std = da_all_jul_dec.std(dim='time')

但是,输出 DataArray 对象丢失了 time 维度。

假设您从以下设置开始:

import pandas as pd
import xarray as xr

times = pd.date_range('2000', periods=100, freq='M')
da = xr.DataArray(range(len(times)), [('time', times)])
resampled = da.resample(time='6MS', closed='left').sum('time')

获得接近您期望结果的快速方法是使用 groupby,按一年中的月份分组:

result = resampled.groupby('time.month').std('time')

这将为您留下具有 'month' 维度的结果 DataArray,其值为 17:

<xarray.DataArray (month: 2)>
array([160.269218, 164.972725])
Coordinates:
  * month    (month) int64 1 7

如果您想要更具描述性的标签,您可以构造一个 DataArray 用于分组,例如

jan_jun = xr.full_like(resampled.time, 'jan-jun', dtype='<U7')
jul_dec = xr.full_like(resampled.time, 'jul-dec', dtype='<U7')
labels = xr.where(resampled.time.dt.month == 1, jan_jun, jul_dec)
labels = labels.rename('time')
result = resampled.groupby(labels).std('time')

在这种情况下,结果如下:

<xarray.DataArray (time: 2)>
array([160.269218, 164.972725])
Coordinates:
  * time   (time) object 'jan-jun' 'jul-dec'