当前位置 : 主页 > 手机开发 > 其它 >

什么是从数据帧中的带时间戳的行分区和聚合间隔的有效方法?

来源:互联网 收集:自由互联 发布时间:2021-06-22
从带有时间戳行的数据框(strptime结果),聚合间隔统计数据的最佳方法是什么? 间隔可以是一小时,一天等. 有聚合函数,但这对于将每一行分配给一个区间没有帮助.我打算在数据框中添加
从带有时间戳行的数据框(strptime结果),聚合间隔统计数据的最佳方法是什么?

间隔可以是一小时,一天等.

有聚合函数,但这对于将每一行分配给一个区间没有帮助.我打算在数据框中添加一个表示间隔的列,并将其与聚合一起使用,但是如果有更好的解决方案,那么听到它会很棒.

感谢您的任何指示!

示例数据

五行,时间戳从03:00开始分为15分钟.

间隔1

>“2010-01-13 03:02:38 UTC”
>“2010-01-13 03:08:14 UTC”
>“2010-01-13 03:14:52 UTC”

间隔2

>“2010-01-13 03:20:42 UTC”
>“2010-01-13 03:22:19 UTC”

结论

使用像xts这样的时间序列包应该是解决方案;但是我没有成功使用它们并且使用切割进行了缠绕.由于我目前只需绘制直方图,行按间隔分组,这就足够了.

cut使用喜欢如此:

interv <- function(x, start, period, num.intervals) {
  return(cut(x, as.POSIXlt(start)+0:num.intervals*period))
}
切割矢量的标准函数是cut和findInterval:

v <- as.POSIXct(c(
  "2010-01-13 03:02:38 UTC",
  "2010-01-13 03:08:14 UTC",
  "2010-01-13 03:14:52 UTC",
  "2010-01-13 03:20:42 UTC",
  "2010-01-13 03:22:19 UTC"
))

# Your function return list:
interv(v, as.POSIXlt("2010-01-13 03:00:00 UTC"), 900)
# [[1]]
# [1] "2010-01-13 03:00:00"
# [[2]]
# [1] "2010-01-13 03:00:00"
# [[3]]
# [1] "2010-01-13 03:00:00"
# [[4]]
# [1] "2010-01-13 03:15:00 CET"
# [[5]]
# [1] "2010-01-13 03:15:00 CET"

# cut returns factor, you must provide proper breaks:
cut(v, as.POSIXlt("2010-01-13 03:00:00 UTC")+0:2*900)
# [1] 2010-01-13 03:00:00 2010-01-13 03:00:00 2010-01-13 03:00:00
# [4] 2010-01-13 03:15:00 2010-01-13 03:15:00
# Levels: 2010-01-13 03:00:00 2010-01-13 03:15:00

# findInterval returns vector of interval id (breaks like in cut)
findInterval(v, as.POSIXlt("2010-01-13 03:00:00 UTC")+0:2*900)
# [1] 1 1 1 2 2

对于记录:cut有一个POSIXt类型的方法,但遗憾的是没有办法提供start参数,效果是:

cut(v,"15 min")
# [1] 2010-01-13 03:02:00 2010-01-13 03:02:00 2010-01-13 03:02:00
# [4] 2010-01-13 03:17:00 2010-01-13 03:17:00
# Levels: 2010-01-13 03:02:00 2010-01-13 03:17:00

如你所见,它的开始于03:02:00.您可能会混淆输出因子的标签(将标签转换为时间,以某种方式转换并转换回字符).

网友评论