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
,其值为 1
或 7
:
<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'
我的时间序列数据是一个名为 da_output_halfyearly
:
<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
,其值为 1
或 7
:
<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'