填补xts中日期之间的空白

Posted

技术标签:

【中文标题】填补xts中日期之间的空白【英文标题】:Fill gaps between dates in xts 【发布时间】:2019-08-14 00:45:21 【问题描述】:

所以我有一个非常基本的问题。假设我们在时间序列对象中有一些日期间隔,我想用任意值填充这些间隔。例如,假设我们有:

i <- c(seq.Date(from = as.Date("2015-01-01", format = "%Y-%m-%d"), to = as.Date("2016-01-01", format = "%Y-%m-%d"), by = "month"),
       seq.Date(from = as.Date("2017-01-01", format = "%Y-%m-%d"), to = as.Date("2018-01-01", format = "%Y-%m-%d"),by = "month"))

ts <- xts(rep(0,length(i)), order.by = i)

            [,1]
2015-01-01    0
2015-02-01    0
2015-03-01    0
2015-04-01    0
2015-05-01    0
2015-06-01    0
2015-07-01    0
2015-08-01    0
2015-09-01    0
2015-10-01    0
2015-11-01    0
2015-12-01    0
2016-01-01    0
2017-01-01    0
2017-02-01    0
2017-03-01    0
2017-04-01    0
2017-05-01    0
2017-06-01    0
2017-07-01    0
2017-08-01    0
2017-09-01    0
2017-10-01    0
2017-11-01    0
2017-12-01    0
2018-01-01    0

我希望实现的是用1 在两个任意日期(即start.dateend.date)之间的所有月份“填充”时间序列ts。有什么建议吗?

我的尝试:

  if(index(ts)[1] > start.date)
    len.aux <- length(seq(from = start.date, to = index(ts)[1] %m-% months(1), by = "month"))
    ts <- c(xts(rep(1, len.aux), order.by = seq.Date(from = start.date, to = index(ts)[1] %m-% months(1), by = "month")), ts)
   
  if(index(ts)[length(ts)] < end.date)
    len.aux <- length(seq(from = index(ts)[length(ts)] %m+% months(1), to = end.date, by = "month"))
    ts <- c(ts, xts(rep(1, len.aux), order.by = seq.Date(from = index(ts)[length(ts)] %m+% months(1), to = end.date, by = "month")))
   

但是,这只填补了系列“尾部”的空白,并没有填补中间的空白。

感谢您的帮助!

请注意,这只是我的问题的一个最小工作示例

【问题讨论】:

你的意思是它应该填写从 2016 年 2 月到 2016 年 12 月的所有日期并填写 1 作为值? 任意开始日期和结束日期之间的所有日期,这些日期在原始系列中未考虑在内。所以我们可以说从 1 月 15 日到 10 月 18 日(按月) Insert rows for missing dates/times的可能重复 【参考方案1】:

您可以使用tsibble 包:

library(tsibble)
i <- c(seq.Date(from = as.Date("2015-01-01", format = "%Y-%m-%d"), to = as.Date("2016-01-01", format = "%Y-%m-%d"), by = "month"),
       seq.Date(from = as.Date("2017-01-01", format = "%Y-%m-%d"), to = as.Date("2018-01-01", format = "%Y-%m-%d"),by = "month"))

tsibble(datetime = yearmonth(i), 
        value    = 0, index = datetime) %>% 
  fill_gaps(value = 1) %>% 
  View()

yearmonth 函数将确保索引为每月(默认为每日)。然后函数fill_gaps 将包含缺失的月份,并将value 列中的缺失值设置为1(默认为NA)。

【讨论】:

以上是关于填补xts中日期之间的空白的主要内容,如果未能解决你的问题,请参考以下文章

复制记录以填补 Google BigQuery 中日期之间的空白

填补日期空白和插值

填补 MultiIndex Pandas Dataframe 中的日期空白

填补 SQL Server 日期范围中的空白

填补熊猫数据框中的日期空白

复制记录组以填补 Google BigQuery 中的多个日期空白