You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:03:24