如何用Xarray简便实现按月份分组统计各phase_ID的出现次数?
问题:统计不同相位ID的月度出现次数
我拥有一个包含变量phase_ID的Xarray Dataset,该变量取值范围为1至8,数据为日度频率,结构如下:
<xarray.Dataset> Dimensions: (time: 1095) Coordinates: * time (time) datetime64[ns] 1979-01-01 1979-01-02 ... 1981-12-30 Data variables: phase_ID (time) int64 8 2 6 4 5 6 6 4 8 3 5 8 3 ... 3 2 3 0 1 4 5 3 4 0 8 7
可通过以下代码生成示例数据:
import pandas as pd import xarray as xr import numpy as np time_length = 365*3 time = pd.date_range(start='1979-01-01T00:00:00.000000000', freq='D', periods=time_length) ds = xr.DataArray(np.random.randint(1,9, size=(time_length)), dims=['time'], coords={'time':time}).to_dataset(name='phase_ID')
我已尝试以下方法:
# 注:原代码中ds.amplitude应为笔误,实际数据集只有phase_ID变量 for group in ds.phase_ID.groupby(ds.phase_ID): single_phase = group[1].groupby('time.month').count()
但该方法需要进行大量合并操作,请问是否有更简便的实现方式?
解决方案
可以直接利用Xarray的多键分组聚合功能,一次完成统计,无需循环和后续合并操作:
方法1:直接按phase_ID和time.month分组
# 一次分组统计每个phase_ID在各月份的出现次数 monthly_phase_counts = ds.groupby([ds.phase_ID, 'time.month']).count()
方法2:先提取月份为独立坐标再分组(可读性更强)
# 给数据集添加month坐标 ds['month'] = ds.time.dt.month # 按phase_ID和month分组统计 monthly_phase_counts = ds.groupby(['phase_ID', 'month']).count()
结果说明
最终得到的monthly_phase_counts是一个Xarray Dataset,包含以下结构:
- 维度:
phase_ID(取值1-8)、month(取值1-12) - 变量
phase_ID的值即为对应相位在对应月份的出现次数
这种方式完全利用Xarray的向量化操作,避免了循环和合并步骤,代码更简洁高效。
内容的提问来源于stack exchange,提问作者Alex Borowiak
相关产品推荐
相关产品推荐

