xarray计算3月滑动均值无法跨年度导致年初月份为空的问题咨询
解决方案
问题根因
你当前的xarray对象将year和month拆分为两个独立维度,rolling操作默认仅在单个维度内部独立计算,即每个年份下的12个月份会单独执行滑动窗口计算,自然无法跨年份调取前一年11、12月的数据来计算当年1、2月的均值。
xarray本身没有提供直接让滑动窗口跨两个关联维度联动的参数,最稳妥的解决方式是先将离散的年、月维度合并为连续的时间维度,再执行滑动计算。
具体操作步骤
步骤1:合并年、月为连续时间维度
import pandas as pd import xarray as xr # 基于year和month生成连续的datetime类型时间坐标 my_xarray = my_xarray.assign_coords( time=pd.to_datetime(my_xarray.year.astype(str) + "-" + my_xarray.month.astype(str)) ) # 将(year, month)两个维度堆叠为单一时序维度time my_xarray = my_xarray.stack( time=("year", "month") ).assign_coords(time=my_xarray.time)
步骤2:在连续时间维度上计算3个月滑动均值
# 窗口会自动按时间顺序跨年度计算,不会每年重置 my_xarray = my_xarray.rolling(time=3, center=False).mean()
步骤3(可选):恢复原始(year, lat, lon, month)维度结构
如果后续需要回到原来的维度排列,执行以下操作即可:
my_xarray = my_xarray.assign_coords( year=my_xarray.time.dt.year, month=my_xarray.time.dt.month ).set_index(time=["year", "month"]).unstack("time")
注意事项
- 2020年的1、2月因为没有更早的2019年数据,仍会是空值,这是时序边界的正常情况;如果你的数据是气候态周期数据,可以手动将2024年的末尾2个月拼接到数据开头做周期填充,即可得到2020年1、2月的计算结果。
- 你也可以通过调整
rolling的center参数为True得到中心滑动平均结果,具体根据你的计算需求选择即可。
内容的提问来源于stack exchange,提问作者random__human
相关产品推荐
相关产品推荐

