在R中计算每分钟的平均值

3

我有一个包含两个参数(日期和数值)的data.table,现在我想计算每分钟(或每15分钟)的平均值。

  • 我一开始认为应该将日期分成小时和分钟
  • 然后计算时间间隔内的平均值

但我真的不知道该怎么做,也许你会有想法

例如,这是简单的数据。

date                Value
2015-07-01 00:00:23 1.83
2015-07-01 00:00:24 1.68
2015-07-01 00:00:25 1.29
2015-07-01 00:00:40 14.23
2015-07-01 00:00:41 0.96
2015-07-01 00:00:46 4.93
2015-07-01 00:01:12 26.44
2015-07-01 00:02:02 49.66
2015-07-01 00:02:05 3.00
2015-07-01 00:02:08 3.19
2015-07-01 00:02:27 19.42
2015-07-01 00:02:32 4.44
2015-07-01 00:02:45 12.77
2015-07-01 00:02:49 4.44
2015-07-01 00:03:40 50.71
2015-07-01 00:03:50 10.64
2015-07-01 00:03:52 1.18
2015-07-01 00:03:52 0.99
2015-07-01 00:03:54 1.32
2015-07-01 00:03:56 2.20

这里有一段生成测试数据的代码:
dd <- data.table(date = c("2015-07-01 00:00:23", "2015-07-01 00:00:24", "2015-07-01 00:00:25","2015-07-01 00:00:40", "2015-07-01 00:00:46","2015-07-01 00:01:12","2015-07-01 00:02:02","2015-07-01 00:02:08","2015-07-01 00:02:27","2015-07-01 00:02:32","2015-07-01 00:02:45","2015-07-01 00:02:49","2015-07-01 00:03:40","2015-07-01 00:03:50","2015-07-01 00:03:52","2015-07-01 00:03:54","2015-07-01 00:03:56"),
             value = c(1.83,1.68,1.29,14.23,0.96,4.93,26.44,3.00,3.19,19.42,4.44,50.71,10.64,1.18,0.99,1.32,2.20))

3
“Quarter” 是什么意思? - undefined
@RonakShah:一年的四分之一。 - undefined
1
@JoshuaUlrich 你怎么知道它不是一个小时的四分之一或者一分钟的四分之一? - undefined
如果这是季度数据,那么这些数据不足以代表问题。此外,不清楚 OP 是想添加新列还是想对每个季度进行聚合。 - undefined
大家好,感谢关注。对于不清楚的描述,我已经进行了修改,希望现在对你们来说更加清晰明了了 :) - undefined
2个回答

4

如果你说“by quarter”时是指“一刻钟”,那么我会将你的data.table转换为xts对象并使用xts::period.apply

library(xts)
x <- as.xts(dd[,date := as.POSIXct(date)])
period.apply(x, endpoints(x, "minutes", 15), mean)
#                        value
# 2015-07-01 00:03:56 8.732353

如果您所说的“quarter”指的是“一年的季度”,那么您可以使用我的原始答案:

您可以使用zoo::yearqtr创建一个季度时间值,以进行聚合。然后使用正常的data.table聚合步骤。

dd[, avg := mean(value), by = zoo::as.yearqtr(dd$date, "%Y-%m-%d")]

1
嗨,@Joshua,谢谢你的回答。如果时间间隔是15分钟(一刻钟),那么我能否也使用zoo函数呢? - undefined

4
我们可以使用 lubridate 包中的 minute 函数。请注意,data.table 有一个 hour 函数。
我们可以使用 cut 函数将分钟格式化为每小时的四分之一。
library(lubridate)
dd[, c('Hour', 'Minute') := .(data.table::hour(date), minute(date))
 ][, Minute_Cut := cut(Minute, breaks = c(0,15,30,45,60), include.lowest = T)
 ][, .(Avg = mean(value)), .(Hour, Minute_Cut)]

#    Hour Minute_Cut      Avg
# 1:    0     [0,15] 8.732353

如果您只想按每分钟计算,我们可以避免cut步骤:
dd[, c('Hour', 'Minute') := .(data.table::hour(date), minute(date))
 ][, .(Avg = mean(value)), .(Hour, Minute)]

#    Hour Minute      Avg
# 1:    0      0  3.99800
# 2:    0      1  4.93000
# 3:    0      2 17.86667
# 4:    0      3  3.26600

非常感谢!它适用于我的数据集!对我来说还有很多未知的包! - undefined
1
@ZAWD 注意,data.table 的最新开发版本也有一个 minute 函数 - 实际上,我是它的作者 ;-) - undefined
1
通过install.packages("data.table", type = "source", repos = "http://Rdatatable.github.io/data.table")进行安装。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接