使用xr.open_mfdataset处理多NC文件时小时均值时间维度异常
问题原因及解决方案
核心问题
你没搞对重采样后的聚合逻辑——要么是错误地对原始筛选的逐小时数据集调用了mean(dim="time"),要么是在重采样对象的聚合操作里用了多余参数,导致没完成按日分组的均值计算。
具体分析
- 用
isel筛选出的5月数据集dm,time维度是所有5月的逐小时数据(41年×31天×24小时=30504个时间点)。 dm.resample(time='1D')只是定义了按日分组的规则,生成一个重采样对象,此时显示的1271组是正确的,但这只是分组规则,还没计算均值。- 如果你直接对
dm调用mean(dim="time"),本质是对所有30504个小时数据做全局平均?不对,你提到结果维度是14641,这说明你的筛选步骤可能也有疏漏——比如isel的布尔索引没生效?不过更大概率是你没针对重采样对象执行聚合,而是误操作了原始数据集。
正确操作步骤
1. 先确保5月数据筛选正确
把isel换成更稳妥的where或sel,彻底过滤非5月数据并丢弃无效时间点:
# 推荐的5月筛选方式 dm = ds.where(ds.time.dt.month == 5, drop=True) # 或者 dm = ds.sel(time=ds.time.dt.month == 5)
执行后用print(dm.time.size)验证,应该得到30504,这说明筛选没问题。
2. 链式调用重采样+聚合
直接对重采样对象调用mean(),不用额外指定dim="time"——重采样规则已经明确按time='1D'分组,聚合会自动对每组内的小时数据算均值:
# 按日重采样并计算日平均 dm_daily = dm.resample(time='1D').mean()
此时dm_daily.time.size就是1271(41年×31天),完全符合预期。
避坑:错误操作示例
如果你的代码是下面这样,肯定出问题:
# 错误:只生成重采样对象,没做聚合 resampler = dm.resample(time='1D') # 错误:对原始dm而非重采样对象求平均 result = dm.mean(dim="time")
额外验证
可以打印重采样后的时间维度确认:
print(dm_daily.time)
输出会包含1979-05-01到2019-05-31的所有每日时间戳,一共1271个。
内容的提问来源于stack exchange,提问作者Yash_U
相关产品推荐
相关产品推荐

