为什么xarray使用resample.mean计算35年平均时会出现额外时间项?
问题原因
你用resample计算得到的结果不符合预期,核心是resample采用基于日历时间对齐的分组逻辑,而非你预期的「按时间步存储顺序每35个为一组」的固定长度分块逻辑。
xarray的年频率35A默认采用closed='right'(区间左开右闭)、label='right'(用区间右边界的时间作为分组标签)的规则,且会自动按日历年度对齐分段边界。当年平均数据的时间戳默认落在年中(7月1日)、或者时间序列的起始/结束值和分段边界不匹配时,就会出现多出来1个不满35年的分段,后续分段的时间覆盖范围也和你预期的整35年分块不一致,自然和NCO的计算结果有差异。
解决方案
方案1(推荐,和NCO分块逻辑完全一致)
直接按时间步序号分组,完全不依赖日历时间属性,严格按存储顺序每35个时间步求均值:
import numpy as np filename = '/glade/scratch/mberdahl/127kaH11/MOC/MOC_only_127kaH11_AnnMeans.nc' ds = xr.open_dataset(filename) # 生成分组标签:每35个时间步为一组,共50组标签0-49 group_idx = np.arange(len(ds.time)) // 35 MOC_35yr = ds.groupby(group_idx).mean(dim='time') # 可选:还原time维度,用每个分段的第一个时间作为维度坐标 MOC_35yr = MOC_35yr.rename({'group': 'time'}).assign_coords(time=ds.time[::35])
方案2(坚持用resample的调整方法)
手动调整resample的对齐参数,匹配你的分块需求,再过滤掉空分段:
# origin设为时间序列第一个点,强制按起始时间对齐分段,closed和label都设为left MOC_35yr = ds.resample( time="35A", origin=ds.time[0], closed='left', label='left' ).mean() # 过滤掉首尾多余的空值分段 MOC_35yr = MOC_35yr.dropna(dim='time', how='all')
内容的提问来源于stack exchange,提问作者user14771692
相关产品推荐
相关产品推荐

