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

如何在含小时维度的xarray中按年计算均值与分位数?

处理带小时分辨率的Xarray时间序列:计算多年均值与分位数

嘿,这个问题我之前也碰到过!其实xarray里有很简便的方法来处理带小时分辨率的时间序列,不管是计算多年逐日均值还是逐小时的气候态,甚至分位数都很容易搞定~

核心思路

你之前用groupby('time.dayofyear')处理日采样数据的思路是对的,但小时采样时,同一个dayofyear会对应多个时次(比如6小时采样的话,每天有4个数据点)。我们只需要根据需求,要么先聚合到日分辨率,要么结合小时维度一起分组,就能解决问题。


方法1:计算多年逐日平均(聚合到日分辨率)

如果你的目标是得到每天的多年平均(忽略小时细节),可以先把小时数据聚合为日均值,再用你熟悉的dayofyear分组方法:

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

# 生成示例数据(替换成你的真实数据)
time = pd.date_range('2000-01-01', '2010-01-01', freq='6h')
arr = xr.DataArray(
    np.random.randn(len(time)), dims='time', coords={'time' : ('time', time)}
)

# 第一步:将小时数据聚合为日均值
daily_arr = arr.resample(time='D').mean()

# 第二步:按dayofyear分组计算多年平均
daily_climatology = daily_arr.groupby('time.dayofyear').mean('time')

# 查看结果:366个值(包含闰年的2月29日)
print(daily_climatology.shape)  # 输出 (366,)

方法2:计算逐小时的多年气候态(保留小时分辨率)

如果需要保留小时信息(比如想知道每年1月1日00时、06时...的多年平均),可以同时按dayofyear和hour分组:

# 按日序和小时分组,计算均值
hourly_climatology = arr.groupby([arr.time.dt.dayofyear, arr.time.dt.hour]).mean('time')

# (可选)将分组结果整理成二维数组(日序 × 小时),方便查看和后续操作
hourly_climatology = hourly_climatology.unstack().transpose('dayofyear', 'hour')

# 查看结果:366天 × 4个小时(对应6h采样频率)
print(hourly_climatology.shape)  # 输出 (366, 4)

计算分位数

不管是逐日还是逐小时的场景,计算分位数只需要把mean换成quantile,并指定你需要的分位数数值即可:

# 计算逐日的中位数(0.5分位数)和90分位数
daily_quantiles = daily_arr.groupby('time.dayofyear').quantile([0.5, 0.9], dim='time')

# 计算逐小时的25%、50%、75%分位数
hourly_quantiles = arr.groupby([arr.time.dt.dayofyear, arr.time.dt.hour]).quantile([0.25, 0.5, 0.75], dim='time')

小提示

  • 对于闰年的情况,xarray的dayofyear会自动识别366天,不需要额外处理;
  • 如果你的采样频率是其他小时间隔(比如3h),只需要把time.dt.hour换成对应的时间分量即可,比如用time.dt.strftime('%j-%H:%M')来精确匹配时分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:06:29