R语言fill_gaps()无法完整填充周度时间序列所有缺失间隔的问题
问题原因
fill_gaps()是tsibble包的专属函数,仅能识别已声明时间索引、明确观测间隔的tsibble对象,你当前代码有两个核心错误:
- 初始构造的
data是普通tibble,且yearweek列是字符串类型,既没有转成yearweek时间类,也没有转为tsibble指定索引,函数无法识别这是周度频率的时间序列,自然不会按周步长补全数据,只会离散拼接你传入的几个时间点,才会出现间隔错乱的问题。 - 参数里设置的
.start = yearweek("2016-01-01")和你要求的起始点2015 W53不匹配。
正确实现代码
不需要手动传入完整索引序列,只要先把数据处理成符合要求的tsibble即可:
library(tibble) library(dplyr) library(tsibble) # 处理原始数据:转时间类型、转为tsibble指定索引 data <- tibble(yearweek = c("2020 W25", "2020 W33"), qty = c(100, 150)) %>% mutate(yearweek = yearweek(yearweek)) %>% as_tsibble(index = yearweek) # 补全周度序列 data_filled <- data %>% fill_gaps( qty = 0, .start = yearweek("2015 W53"), .end = yearweek(Sys.Date()), # 用Sys.Date()避免时区导致的周度计算偏差 .full = TRUE )
手动索引实现方案
如果你想通过传入完整索引序列的方式实现(逻辑和fill_gaps()完全一致),可以先生成完整周序列再做连接,适合不想使用tsibble对象的场景:
library(tidyr) full_weeks <- tibble( yearweek = seq(from = yearweek("2015 W53"), to = yearweek(Sys.Date()), by = 1) # 步长1对应间隔1周 ) data_filled_manual <- full_weeks %>% left_join(data, by = "yearweek") %>% mutate(qty = replace_na(qty, 0))
内容的提问来源于stack exchange,提问作者Duccio Borchi
相关产品推荐
相关产品推荐

