对于 POSIXct 格式的数据,您可以使用 cut 函数创建 15 分钟分组,然后按这些组聚合。下面的代码展示了如何在 base R 以及 dplyr 和 data.table 包中执行此操作。
首先,创建一些假数据:
set.seed(4984)
dat = data.frame(time=seq(as.POSIXct("2016-05-01"), as.POSIXct("2016-05-01") + 60*99, by=60),
count=sample(1:50, 100, replace=TRUE))
基础 R
cut将数据分成15分钟组:
dat$by15 = cut(dat$time, breaks="15 min")
time count by15
1 2016-05-01 00:00:00 22 2016-05-01 00:00:00
2 2016-05-01 00:01:00 11 2016-05-01 00:00:00
3 2016-05-01 00:02:00 31 2016-05-01 00:00:00
...
98 2016-05-01 01:37:00 20 2016-05-01 01:30:00
99 2016-05-01 01:38:00 29 2016-05-01 01:30:00
100 2016-05-01 01:39:00 37 2016-05-01 01:30:00
现在aggregate被新的分组列,使用sum作为聚合函数:
dat.summary = aggregate(count ~ by15, FUN=sum, data=dat)
by15 count
1 2016-05-01 00:00:00 312
2 2016-05-01 00:15:00 395
3 2016-05-01 00:30:00 341
4 2016-05-01 00:45:00 318
5 2016-05-01 01:00:00 349
6 2016-05-01 01:15:00 397
7 2016-05-01 01:30:00 341
dplyr
library(dplyr)
dat.summary = dat %>% group_by(by15=cut(time, "15 min")) %>%
summarise(count=sum(count))
data.table
library(data.table)
dat.summary = setDT(dat)[ , list(count=sum(count)), by=cut(time, "15 min")]
更新:回答评论,对于这种情况,每个分组间隔的终点是as.POSIXct(as.character(dat$by15)) + 60*15 - 1。换句话说,分组间隔的终点是从间隔开始算起的 15 分钟减去 1 秒。我们添加 60*15 - 1 因为POSIXct 以秒为单位。 as.POSIXct(as.character(...)) 是因为 cut 返回一个因子,这只是将其转换回日期时间,以便我们可以对其进行数学运算。
如果您希望终点指向下一个间隔之前的最近一分钟(而不是最近的一秒),您可以发送至as.POSIXct(as.character(dat$by15)) + 60*14。
如果您不知道中断间隔,例如,因为您选择了中断次数并让 R 选择间隔,您可以通过执行 max(unique(diff(as.POSIXct(as.character(dat$by15))))) - 1 找到要添加的秒数。