填写缺失的时间序列间隔
Fill out missing time series intervals
我有几个时间间隔记录如下:
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)
创建间隔。不过,我最初的想法是我可以以某种方式将其组合起来以填补缺失的间隔。
我也一直在考虑是否有任何 "brut-force" 方法可以用来填充间隔。例如,函数将在上一行中获取 Out
的最后一项,并从下一行中获取 In
的最后一项,但尚未找到任何解决方案。
理想情况下,我想知道是否有任何聪明的方法可以使用 zoo
、lubridate
、xts
或 R 中的其他工具来做到这一点?
试试这个:
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
# ...
我有几个时间间隔记录如下:
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)
创建间隔。不过,我最初的想法是我可以以某种方式将其组合起来以填补缺失的间隔。
我也一直在考虑是否有任何 "brut-force" 方法可以用来填充间隔。例如,函数将在上一行中获取 Out
的最后一项,并从下一行中获取 In
的最后一项,但尚未找到任何解决方案。
理想情况下,我想知道是否有任何聪明的方法可以使用 zoo
、lubridate
、xts
或 R 中的其他工具来做到这一点?
试试这个:
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
# ...