如何使用多个开始日期和结束日期的输入在时间序列内的指定日期/时间范围内计算摘要统计数据?

时间:2015-04-21 20:29:06

标签: r time dataframe

我有一个带有时间序列数据的(虚拟)数据框:

datetime <- as.POSIXct(seq(ISOdate(2012,12,22), ISOdate(2012,12,23), by="hour"), tz='EST')
data <- rnorm(25, 10, 5)
df <- data.frame(datetime, data)

我还有一个单独的数据框,其开始和结束时间为两列:

start <- as.POSIXct(c('2012/12/22 19:53', '2012/12/22 23:05'), tz='gmt')
end <- as.POSIXct(c('2012/12/22 21:06', '2012/12/22 23:58'), tz='gmt')
index <- data.frame(start, end)

我想做的是“提供”主数据框'df''索引'数据框,并且,对于每个开始和结束日期/时间组合,找到其中“数据”的平均值日期/时间范围。这相当于为每个开始/结束时间手动执行'df'的子集,但是以组合的方式。 (我的真实数据集包含多年的数据,以及我希望为其提供的一百个日期/时间范围。)

最终目标是在这些时间内有三列,开始时间,结束时间和“数据”的平均数值。

2 个答案:

答案 0 :(得分:1)

通常,您不希望通过调用rbind一次增加一行数据框,因为效率非常低(有关详细信息,请参阅the second circle of the R inferno)。在您的情况下,您可以使用sapply来复制此逻辑:

index$mean <- sapply(1:nrow(index), function(i) mean(df[df$datetime >= index$start[i] &
                                                        df$datetime <= index$end[i],2]))
index
#                 start                 end     mean
# 1 2012-12-22 19:53:00 2012-12-22 21:06:00 9.563336
# 2 2012-12-22 23:05:00 2012-12-22 23:58:00      NaN

答案 1 :(得分:0)

我想出了如何用for循环来做到这一点。如果有人有更有效的解决方案,那就太好了。 for循环解决方案:

d <- data.frame()
for i in (1:nrow(index)) {
    d <- rbind(d, mean(subset(df, datetime >= index[i,1] &
                                  datetime <= index[i,2])[,2]))}