在水文气象数据分析中,我们经常需要对时间序列进行平滑处理,以识别数据的长期趋势或消除高频噪声。比如,我们可能想要计算5天滑动平均温度来消除日变化的影响,或者计算30天滑动累积降水量来监测干旱情况。这些操作背后都依赖一个核心的技术——滑窗(rolling window)。
滑窗技术就像给数据戴上一副“移动的眼镜”,每次只聚焦在一个固定大小的窗口上,然后让这个窗口沿着时间轴滑动,对每个窗口内的数据进行统计计算。这种技术在水文和气象领域应用广泛:
滑动平均:平滑逐日温度,突出季节变化
滑动累积:计算连续降水累积量,评估洪涝风险
滑动极值:提取每个窗口的最大风速,分析极端天气
在Python气象数据处理生态中,xarray提供了强大而优雅的滑窗处理工具——rolling方法。它不仅支持多维数据(如时空网格数据),还能自动处理缺失值、坐标对齐等问题,是气象数据分析师不可或缺的技能。
本文将简单介绍xarray中rolling滑窗技术的核心语法、实用技巧和气象应用案例,帮助你轻松应对各种时间序列滑窗分析需求。
滑窗本质上是:用一个固定长度的窗口,在时间轴上逐点滑动,并对窗口内数据进行统计计算。
xarray.rolling是xarray中用于创建滑动窗口的方法。它沿着指定的维度(通常是时间)创建一个固定大小的窗口,并允许你对每个窗口内的数据进行各种计算。
# 创建滚动窗口对象rolling_obj = data_array.rolling(dim=window_size, min_periods=None, center=False)# 然后应用聚合函数result = rolling_obj.mean() # 滑动平均# 或 result = rolling_obj.sum() # 滑动累积# 或 result = rolling_obj.max() # 滑动最大值
主要参数详解:
dim 或 **kwargs:指定窗口维度和大小,如 time=5 或 {'lat': 3, 'lon': 3}(支持空间滑窗)
min_periods:窗口内有效值的最小数目,低于此值则结果为NaN。默认为窗口大小
center:布尔值,决定窗口标签的位置
ds = xr.open_dataset('prec.nc')prec = ds['prec']vals = prec.valuesprint(vals.shape)print(vals[:20])
不设置center=True, 默认标签是取在最后
prec_rm = prec.rolling(time=3).mean()prec_rm
注意看,上面的第一个非空值约0.09,表示当前时刻及前2个时刻的平均降水,我们对原始降水的前20个值求累积来验证,发现第三个时刻是0.27,约等于0.9三倍,符合。
设置center=True,标签设置在中间时刻
prec_rm = prec.rolling(time=3, center=True).mean()print('前5个时刻的累积值:',np.cumsum(vals[:5]))prec_rm # 第2个时刻是0.09,等于上面第三个时刻累计值的1/3(滑窗为3)
prec_rs = prec.rolling(time=7).sum()print('前10个时刻的累积值:',np.cumsum(vals[:10]))prec_rs.values[:10]
std30 = prec.rolling(time=30).std()
construct方法可以将窗口内的数据显式地构造为一个新维度,从而实现自定义计算:
滑动窗口计算周内最大日降水差异
window = 7windowed = prec.rolling(time=window).construct("window")windowed = windowed.isel(time=slice(window-1, None))max_diff = windowed.max(dim="window") - windowed.min(dim="window")max_diff
做预报的同学通常需要将rolling的结果记录在最前面的时刻,比如我要计算“未来 7 天累计降水”,并记录在当前时间。如何实现向后滑窗?
计算标准化降水指数(SPI)的滑动累积
识别热浪事件(热浪通常定义为连续多日温度超过某个阈值。我们可以结合滚动窗口来识别这样的极端事件)
在风能资源评估中,经常需要分析一段时间内的最大风速
机器学习如时序预测LSTM中,通常需要构造滑动窗口数据,如何实现