将不规则时间序列中的数据添加到5分钟时间步长的时间序列中

时间:2014-07-01 07:19:02

标签: r datetime merge time-series

我有两个时间序列我要合并:activity(几乎)常规,5分钟时间步,另一个temperature是一个不规则的时间序列,时间戳不是在任何时候都匹配activity中的时间戳。

我想将“temperature $ temp”列添加到数据集activity,其中NAs表示没有临时记录的时间,以及分配给{{1}中最接近的时间戳的实际临时记录}。 (可选择最接近的先前或后续时间戳)。

以前我使用approxfun函数来插值温度数据以匹配活动时间序列,但这并不理想,我想只包括实际记录的温度。

到目前为止,我还无法修改在堆栈溢出和其他地方发布的类似时间序列问题的解决方案,因为他们要么假设时间序列在某些时候匹配,要么他们的目标是合并时间序列的输出,以便包括两个数据集的时间戳,这两者都不是这种情况。

activity

我非常感谢您给我的任何帮助或建议。

2 个答案:

答案 0 :(得分:1)

首先,定义一个确定最近索引位置的小辅助函数:

findNearest <- function(x, y)which.min(abs(x - y))

然后使用sapplyfindNearest创建温度的索引向量。使用此索引向量创建所需的温度矢量

idx <- sapply(activity$Date, findNearest, temperature$Date)
activity$temp <- temperature$temp[idx]

结果:

head(activity)
                    Date Activity   temp
1220 2012-10-18 06:36:59      300 12.625
1221 2012-10-18 06:41:59      300 12.625
1222 2012-10-18 06:46:59      300 12.625
1223 2012-10-18 06:51:59      300 12.625
1224 2012-10-18 06:56:59      300 12.625
1225 2012-10-18 07:01:59      300 12.625


tail(activity)
                    Date Activity temp
1233 2012-10-18 07:41:59      300 12.5
1234 2012-10-18 07:46:59      300 12.5
1235 2012-10-18 07:51:59      300 12.5
1236 2012-10-18 07:56:59      300 12.5
1237 2012-10-18 08:01:59      300 12.5
1238 2012-10-18 08:06:59      300 12.5

答案 1 :(得分:0)

data.table中的roll=工具可以执行此操作:

library(data.table)
activity.dt <- data.table(activity, key="Date")[,Date2:=Date]
temperature.dt <- data.table(temperature)

activity.dt[temperature.dt, list(Date=Date2, temp), roll=-Inf][
  activity.dt, list(Date, Activity, temp)]

,并提供:

                   Date Activity   temp
 1: 2012-10-18 06:36:59      300     NA
 2: 2012-10-18 06:41:59      300     NA
 3: 2012-10-18 06:46:59      300     NA
 4: 2012-10-18 06:51:59      300     NA
 5: 2012-10-18 06:56:59      300 12.625
 6: 2012-10-18 07:01:59      300     NA
 7: 2012-10-18 07:06:59      300     NA
 8: 2012-10-18 07:11:59      207     NA
 9: 2012-10-18 07:16:59        0     NA
10: 2012-10-18 07:21:59        0     NA
11: 2012-10-18 07:26:59        0     NA
12: 2012-10-18 07:31:59        0     NA
13: 2012-10-18 07:36:59      153     NA
14: 2012-10-18 07:41:59      300     NA
15: 2012-10-18 07:46:59      300     NA
16: 2012-10-18 07:51:59      300     NA
17: 2012-10-18 07:56:59      300     NA
18: 2012-10-18 08:01:59      300 12.500
19: 2012-10-18 08:06:59      300     NA