如何在含小时维度的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
相关产品推荐
相关产品推荐

