R语言逐时功率预测数据集缺失值的线性插值补全实操咨询
RStudio 逐时能源预测数据缺失值补全实操
前置准备
- 核心使用
imputeTS工具包,专门面向时间序列数据的缺失值处理,适配2万级数据量的运行效率 - 安装命令:
install.packages("imputeTS") - 加载包:
library(imputeTS) - 首先要将分散的日期、小时字段合并为连续的逐时时间戳,避免插值错位:
df$timestamp <- as.POSIXct(paste(df$fecha, df$hora_prog - 1), format = "%Y-%m-%d %H")
这里减1的原因是hora_prog取值为1-24,对应系统可识别的小时为0-23(比如hora_prog=1代表当日0时),合并后可生成严格连续的逐时索引。 - 注意:完成时间戳合并后,必须按时间升序排序数据集,否则插值逻辑会完全错乱:
df <- df[order(df$timestamp), ]
线性插值实现步骤
针对prev_solfot_h3(光伏出力预测)、prev_eol_h3(风电出力预测)两个字段的所有缺失值,直接调用内置线性插值函数即可自动识别连续缺失段、计算两端有效数值的线性拆分结果:
- 光伏字段补全:
df$prev_solfot_h3_filled <- na_interpolation(df$prev_solfot_h3, option = "linear") - 风电字段补全:
df$prev_eol_h3_filled <- na_interpolation(df$prev_eol_h3, option = "linear")
以你提供的10-15点区间数据为例:原有10点光伏值为759、15点为45,中间11-14点共4个连续NA的线性插值结果依次为575.25、391.5、207.75、23.99,符合出力随时间连续变化的逻辑。
适配本场景的其他可选补全方法
由于你的数据是逐时的光伏、风电出力序列,存在固定的日度波动规律,除了纯线性插值,以下方法的补全准确度更高:
- 季节性自适应插值:自动识别数据的日度周期(光伏白天出力、夜间为0的规律),避免线性插值在夜间时段补出非零光伏值的不合理结果,代码:
df$prev_solfot_h3_filled <- na_seadec(df$prev_solfot_h3, find_frequency = TRUE) - 移动平均加权填充:针对短段缺失(1-2小时的孤立NA),用前后相邻4个点的指数加权平均填充,比纯线性值更贴合风电、光伏的短期波动特征,代码:
df$prev_eol_h3_filled <- na_ma(df$prev_eol_h3, k = 4, weighting = "exponential") - 物理规则校验补全:光伏夜间(20点-次日6点)的出力本应为0,对该时段的缺失值不需要插值,直接赋值0即可,代码:
df$prev_solfot_h3_filled[as.numeric(format(df$timestamp, "%H")) %in% c(20,21,22,23,0,1,2,3,4,5)] <- 0
新手实操避坑提醒
- 若连续缺失段长度超过6小时,纯线性插值的误差会显著升高,这类缺失段建议用上周同一时段的历史有效值替代,不要硬用插值结果
- 补全完成后要做合理性校验:光伏出力不可能为负值,风电出力不会超过数据集的历史最大值,可用简单代码过滤异常值:
df$prev_solfot_h3_filled[df$prev_solfot_h3_filled < 0] <- 0df$prev_eol_h3_filled[df$prev_eol_h3_filled > max(df$prev_eol_h3, na.rm = TRUE)] <- max(df$prev_eol_h3, na.rm = TRUE)
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

