【问题标题】:Fill out missing time series intervals填写缺失的时间序列间隔
【发布时间】:2017-05-06 14:00:18
【问题描述】:

我有几个时间间隔记录如下:

  In         Out          tag      
  2008-12-18 2008-12-19   1
  2008-12-22 2008-12-23   1
  2008-12-29 2009-01-02   1
  2009-01-05 2009-01-05   1
  2009-01-13 2009-01-13   1
  2009-01-14 2009-01-14   1
  2009-01-19 2009-01-19   1

我想填写缺失的间隔,使其看起来像这样:

  In         Out          tag      
  2008-12-18 2008-12-19   1
  2008-12-20 2008-12-21   0
  2008-12-22 2008-12-23   1
  2008-12-24 2008-12-28   0
  2008-12-29 2009-01-02   1
  2009-01-03 2008-01-04   0
  2009-01-05 2009-01-05   1
  ...

我知道我可以使用zoo 来填写时间序列中缺失的日期。此外,我还可以使用 lubridate 包中的 interval(start, end) 创建间隔。我最初的想法是,我可以以某种方式将其结合起来以填补缺失的间隔。

我也一直在考虑是否有任何“蛮力”方法可以用来填补间隔。例如,将在上一行中获取最后一项 Out 并从下一行中获取 In 的函数,但没有设法找到任何解决方案。

理想情况下,我想知道是否有任何巧妙的方法可以使用zoolubridatexts 或 R 中的其他工具来做到这一点?

【问题讨论】:

  • “In”和“Out”的天数差异没有遵循任何模式或有任何模式?例如,在第四行,In 和 Out 都在 '2009-01-05' 中。那么,我们如何知道下一个起点是什么以及“In”和“Out”的差异是一天还是同一天?
  • 第二个 df 的第 4 行是 24 - 28。为什么不是 24-25、26-27...?
  • 缺少的间隔没有模式。
  • 我不想将时间间隔分成一天的时间间隔(例如,24-28 到 24-25、26-27 等)。这将不必要地扩展数据集,并且不切实际分析。

标签: r time-series xts zoo lubridate


【解决方案1】:

试试这个:

library(data.table)

df = data.table(
  In=as.Date('2008-12-18') + cumsum(c(0,4,7,7,8,1,5)),
  Out=as.Date('2008-12-19') + cumsum(c(0,4,10,3,8,1,5)),
  tag=1)

toMerge = df[, .(In=Out+1, Out=shift(In-1, type='lead'), tag=0)][In <= Out]

> merge(df, toMerge, all=T)
#            In        Out tag
# 1: 2008-12-18 2008-12-19   1
# 2: 2008-12-20 2008-12-21   0
# 3: 2008-12-22 2008-12-23   1
# 4: 2008-12-24 2008-12-28   0
# 5: 2008-12-29 2009-01-02   1
# 6: 2009-01-03 2009-01-04   0
# ...

【讨论】:

  • 没有让合并工作,但使用了 rbind。非常适合 data.table 解决方案,其中很容易包含副语句。
猜你喜欢
  • 2021-03-23
  • 2019-09-20
  • 1970-01-01
  • 2020-05-07
  • 2018-05-21
  • 1970-01-01
  • 2020-03-19
  • 2013-11-27
  • 1970-01-01
相关资源
最近更新 更多