【问题标题】:adding data from an irregular time series to a timeseries with 5-min timesteps将不规则时间序列中的数据添加到具有 5 分钟时间步长的时间序列
【发布时间】:2014-08-21 16:11:36
【问题描述】:

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

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

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

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

   activity <- structure(list(Date = structure(c(1350542219, 1350542519, 1350542819, 
   1350543119, 1350543419, 1350543719, 1350544019, 1350544319, 1350544619, 
   1350544919, 1350545219, 1350545519, 1350545819, 1350546119, 1350546419, 
   1350546719, 1350547019, 1350547319, 1350547619), class = c("POSIXct", 
   "POSIXt"), tzone = "GMT"), Activity = c(300, 300, 300, 300, 300, 
   300, 300, 207, 0, 0, 0, 0, 153, 300, 300, 300, 300, 300, 300)), .Names = c("Date", 
   "Activity"), row.names = 1220:1238, class = "data.frame")

   temperature <- structure(list(Date = structure(c(1350543180, 1350547140), class =       c("POSIXct", 
  "POSIXt"), tzone = "GMT"), temp = c(12.625, 12.5)), .Names = c("Date", 
  "temp"), row.names = 2:3, class = "data.frame")

output <- structure(list(Date = structure(c(1350542219, 1350542519, 1350542819, 
1350543119, 1350543419, 1350543719, 1350544019, 1350544319, 1350544619, 
1350544919, 1350545219, 1350545519, 1350545819, 1350546119, 1350546419, 
1350546719, 1350547019, 1350547319, 1350547619), class = c("POSIXct", 
"POSIXt"), tzone = "GMT"), Activity = c(300, 300, 300, 300, 300, 
300, 300, 207, 0, 0, 0, 0, 153, 300, 300, 300, 300, 300, 300), 
temp = c(NA, NA, NA, 12.625, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, 12.5, NA)), .Names = c("Date", "Activity", 
"temp"), row.names = 1220:1238, class = "data.frame")

如果您能给我任何帮助或建议,我将不胜感激。

【问题讨论】:

标签: r datetime merge time-series


【解决方案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

【讨论】:

  • 这个解决方案有效,但我真的只希望 temp 列在最接近它被记录的时间给出一个温度值,并让该列的其余部分填充 NA,而不是有一个温度每次分配的值。
【解决方案2】:

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

【讨论】:

  • 这个解决方案似乎很理想;但是,当我使用它时,输出临时列仅包含 NA。活动.dt[温度.dt,列表(日期=日期2,温度),滚动=-Inf]
  • 返回一个与 temperature.dt 具有相同维度的 data.table,包含 3 列:日期(来自 temperature.dt)、日期(来自 activity.dt)和 temp。但是,该函数的第二部分返回带有添加(空)日期列和包含 NA 的临时列的 activity.dt。不知何故,函数第一部分的临时文件没有被带到第二部分。
  • R 版本 3.1.0 (2014-04-10) 平台:x86_64-w64-mingw32/x64(64 位)语言环境:[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252 [ 3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C [5] LC_TIME=English_Australia.1252 附加的基本包:[1] stats graphics grDevices utils datasets 方法基于其他附加包:[1] data.table_1.9.2 通过命名空间加载(和未附加):[1] plyr_1.8.1 Rcpp_0.11.2 reshape2_1.4 stringr_0.6.2 tools_3.1.0
  • 用 github 上的 data.table 1.9.3 试试吧:devtools::install_github("Rdatatable/datatable")
猜你喜欢
  • 2012-05-12
  • 2017-03-06
  • 2020-07-21
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 2014-09-02
  • 2021-04-11
相关资源
最近更新 更多