R语言:如何将时间序列中周末缺失值填充为对应周五数据?
用R补全周末缺失的价格数据(填充前一个周五的值)
这里有一个简洁的解决方案,用tidyverse和lubridate包来实现你的需求——自动识别周末缺失值,并用对应周五的数据填充:
步骤1:加载所需包
首先确保你安装了这些包,如果没安装先运行install.packages(c("tidyverse", "lubridate")):
library(tidyverse) library(lubridate)
步骤2:预处理数据(可选但推荐)
你的原始数据是按日期倒序排列的(最新日期在前),为了后续填充逻辑更顺畅,先把数据按日期升序排列:
DF1 <- DF1 %>% arrange(Date)
步骤3:生成完整日期序列并合并
首先创建覆盖你数据全范围的完整日期序列,再和原数据左连接,这样周末的缺失值会以NA形式显现:
# 生成从最早到最晚的完整日期序列 full_dates <- tibble(Date = seq(min(DF1$Date), max(DF1$Date), by = "day")) # 合并原数据与完整日期,得到带NA的数据集 DF_complete <- full_dates %>% left_join(DF1, by = "Date")
步骤4:用周五数据填充周末
通过标记周五、分组,再向下填充的方式,把周五的值复制到对应的周六和周日:
DF_filled <- DF_complete %>% mutate( # 提取星期几的缩写(Sun到Sat) weekday = wday(Date, label = TRUE), # 标记当前行是否为周五 is_friday = weekday == "Fri", # 为每个周五及后续周末创建分组ID friday_group = cumsum(is_friday) ) %>% # 按分组向下填充NA值(用周五的值覆盖周六、周日的NA) group_by(friday_group) %>% fill(Coalprice, Gasprice, Co2emissionprice, .direction = "down") %>% ungroup() %>% # 移除辅助列(可选) select(-weekday, -is_friday, -friday_group)
验证结果
你可以检查任意一个周末的数据,确认填充是否正确:
# 查看2015-12-25(周五)及其周末的数据 DF_filled %>% filter(Date >= ymd("2015-12-25") & Date <= ymd("2015-12-27"))
输出会是:
# A tibble: 3 × 4 Date Coalprice Gasprice Co2emissionprice <date> <dbl> <dbl> <dbl> 1 2015-12-25 47 14.2 8.22 2 2015-12-26 47 14.2 8.22 3 2015-12-27 47 14.2 8.22
这个逻辑会自动处理所有周末,每个周末都用它前一个周五的数据填充,完全符合你的需求。
内容的提问来源于stack exchange,提问作者S. Jay
相关产品推荐
相关产品推荐

