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

Xarray如何按日期坐标的月、日多索引执行groupby分组计算

解决方法

方案1:构造月日组合键(全版本兼容,最常用)

该方法不需要高版本xarray支持,也是气候领域计算日距平最常用的实现方式,通过构造月-日格式的字符串作为统一分组键,天然匹配不同年份相同月日的分组需求:

import xarray as xr
import pandas as pd
import numpy as np

# 构造示例数据
date = pd.date_range('20110101','20161231',freq='D')
data = np.random.rand(len(date))
da = xr.DataArray(data,dims=['date'],coords=dict(date=date))

# 新增月日组合坐标作为分组键
da = da.assign_coords(monthday=da.date.dt.strftime("%m-%d"))

# 分组计算气候态
climatology = da.groupby("monthday").mean("date")
# 计算日距平
anomalies = da.groupby("monthday") - climatology

如果需要处理2月29日样本过少的问题,可以手动将2月29日映射到2月28日分组:

month = da.date.dt.month
day = da.date.dt.day
# 替换2月29日为2月28日
adjusted_day = xr.where((month == 2) & (day == 29), 28, day)
adjusted_monthday = xr.where(
    (month == 2) & (day == 29), 
    "02-28", 
    da.date.dt.strftime("%m-%d")
)
da = da.assign_coords(monthday=adjusted_monthday)

方案2:多字段分组(xarray 0.19及以上版本支持)

高版本xarray支持传入多个DataArray对象作为分组键,注意不能直接传入字符串列表,需要传入对应的坐标DataArray:

# 先新增month、day坐标
da = da.assign_coords(
    month=da.date.dt.month,
    day=da.date.dt.day
)
# 传入DataArray列表实现双维度分组
da_group = da.groupby([da.month, da.day])
climatology = da_group.mean("date")

报错原因说明

之前调用da.groupby(['date.month','date.day'])报错,是因为xarray的groupby接口不支持直接传入多个坐标名称的字符串列表,仅支持传入单个坐标名称、单个DataArray,或是高版本下的多个DataArray对象列表。


内容的提问来源于stack exchange,提问作者Yongwu Xiu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:54:02