时间序列插值的R/Python函数有哪些?含线性插值示例及移动平均类插值咨询
我来帮你整理下R和Python里适用于时间序列插值的函数,包括你关心的移动平均类方法,先从你给出的示例数据说起:
你给出的线性插值基础示例:
Day 原始x 插值后x 1 4 4 2 NA 3 3 2 2 4 NA 4 5 NA 6 6 8 8
Python 中的时间序列插值函数
1. 线性插值(复现你的示例)
Python里最常用的线性插值工具是pandas的interpolate()方法,默认就采用线性插值逻辑,刚好可以复现你的结果:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'Day': [1, 2, 3, 4, 5, 6], 'x': [4, None, 2, None, None, 8] }) # 执行线性插值 df['linear_interp'] = df['x'].interpolate(method='linear') print(df)
运行后输出的linear_interp列就是你示例中插值后的结果。
2. 移动平均类插值方法
如果你需要基于移动平均思想的插值/填充,这些方法很实用:
- 滚动窗口均值填充:用滑动窗口内的均值来填补NA,适合平滑局部波动
# 窗口大小为3,中心对齐(优先用当前值前后的数据计算均值) df['rolling_mean_fill'] = df['x'].fillna( df['x'].rolling(window=3, center=True, min_periods=1).mean() )
- 指数加权移动平均(EWMA)填充:对近期数据赋予更高权重,适合有趋势性的时间序列
# span=3表示加权窗口的等效大小,adjust=False保证递归计算 df['ewm_fill'] = df['x'].fillna( df['x'].ewm(span=3, adjust=False).mean() )
R 中的时间序列插值函数
1. 线性插值(复现你的示例)
R里可以用基础函数approx()或者zoo包的na.approx()来实现线性插值,这里用approx()复现你的结果:
# 构造示例数据 df <- data.frame( Day = 1:6, x = c(4, NA, 2, NA, NA, 8) ) # 执行线性插值 df$linear_interp <- approx(df$Day, df$x, xout = df$Day)$y print(df)
输出的linear_interp列完全匹配你给出的插值结果。
2. 移动平均类插值方法
R里有不少包支持移动平均类的插值填充:
zoo包的移动均值填充:可以指定窗口大小和对齐方式
library(zoo) # 用窗口大小为3的中心对齐均值填充NA df$rolling_mean_fill <- na.aggregate( df$x, FUN = function(x) mean(x, na.rm = TRUE), k = 3, align = "center" )
TTR包的简单移动平均(SMA)填充:先计算移动均值,再用其填补NA
library(TTR) # 计算窗口大小为3的简单移动平均 sma_vals <- SMA(df$x, n = 3) # 用移动均值填充原始数据中的NA df$sma_fill <- na.fill(df$x, sma_vals)
小总结
- 线性插值适合趋势平稳、缺失值前后数据有明确线性关联的场景;
- 移动平均类方法适合数据有周期性波动、需要平滑填充的场景,能避免线性插值带来的生硬趋势衔接。
内容的提问来源于stack exchange,提问作者mac
相关产品推荐
相关产品推荐

