【问题标题】:calculate the average value per minute in R计算 R 中每分钟的平均值
【发布时间】:2016-08-24 12:42:08
【问题描述】:

我有一个带有两个参数(日期和值)的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))

【问题讨论】:

  • quarter 是什么意思?
  • @RonakShah:一年的四分之一。
  • @JoshuaUlrich 你怎么知道不是一刻钟或一刻钟?
  • 如果那是一年的四分之一,那么这个数据不足以代表这个问题。此外,尚不清楚 OP 是要添加新列还是要为每个季度汇总。
  • 大家好,感谢您的关注,抱歉描述不清楚,我刚刚修改了文字,希望您现在清楚了:)

标签: r date data.table average


【解决方案1】:

既然您说“按季度”时的意思是“一刻钟”,那么我会将您的 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

如果“季度”是指“一年中的一个季度”,那么您可以使用我原来的答案:

您可以使用zoo::yearqtr 创建一个季度时间值以作为汇总依据。然后使用普通的data.table聚合步骤。

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

【讨论】:

  • 嗨,@Joshua,谢谢你的回答,如果间隔时间是15分钟(一刻钟),我也可以使用动物园的功能吗?
【解决方案2】:

我们可以使用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

【讨论】:

  • 非常感谢,它适用于我的数据集!!!对我来说还有很多未知的包!
  • @ZAWD 请注意,data.table 的最新开发版本也有一个 minute 函数 -- 事实上,I authored it ;-)
  • 通过install.packages("data.table", type = "source", repos = "http://Rdatatable.github.io/data.table")安装
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 2014-10-22
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多