如何计算xarray数据集各自然小时均值并保留带日期的时间戳?
问题根源
ds.groupby("time.hour").mean()返回跨日期同小时聚合结果,是因为time.hour提取的是0-23的小时数值作为分组键,所有日期中小时数相同的样本会被归为同一组,最终只会输出24个聚合值,无法区分不同日期的同一小时。拆分数据集计算后丢失日期信息,本质也是分组时没有绑定完整的日期时间锚点导致的。
实现方案
直接使用xarray内置的时间重采样接口做1小时降采样,不需要手动拆分数据集,输出结果的时间维度会自动保留完整的年-月-日T时:分:秒格式的整点时间戳,和你需要的输出格式完全匹配。
核心代码
# 按自然小时聚合求均值,时间标签使用小时整点值 ds_hourly_mean = ds.resample(time="1H", label="left", closed="left").mean()
参数说明:
time="1H":指定重采样步长为1个自然小时label="left":以每个小时区间的左边界(即整点时刻,如00:00-01:00区间对应2015-01-01T00:00:00)作为结果的时间坐标值closed="left":区间左闭合,即每个整点时刻的观测值计入对应整点开始的小时段,符合自然小时的统计逻辑
缺失小时补全(可选)
如果原始数据存在整段小时级别的缺失,需要输出连续无缺口的小时时间序列(无观测的小时对应变量值为NaN),可以在重采样后补充时间轴重索引:
import pandas as pd # 生成覆盖原始数据时间范围的完整小时序列,补全缺失时间点 full_hour_range = pd.date_range( start=ds.time.min().values.astype("datetime64[h]"), end=ds.time.max().values.astype("datetime64[h]"), freq="1H" ) ds_hourly_mean = ds_hourly_mean.reindex(time=full_hour_range)
方法对比
groupby("time.hour"):分组键为0-23的整数,输出维度坐标为0-23的小时数,做跨日期同小时聚合resample(time="1H"):分组键为每个时间点所属自然小时的完整时间锚点,输出维度坐标为带完整日期的整点时间戳,按单个自然小时独立聚合,完全匹配需求。
内容的提问来源于stack exchange,提问作者Casheww
相关产品推荐
相关产品推荐

