【问题标题】:How to group Time Series data into round intervals of 5 minutes in R?如何在 R 中将时间序列数据分组为 5 分钟的轮次间隔?
【发布时间】:2016-01-21 00:32:04
【问题描述】:

我有一个如下所示的时间序列数据框:

  Time                 Source  Value
1 2016-01-20 15:10:04  C04     OPEN
2 2016-01-20 15:09:57  M04     true
3 2016-01-20 15:09:53  M02     true
4 2016-01-20 15:09:53  M03     true
5 2016-01-20 14:44:54  M04     true

现在我想从 00:00:00 开始以 5 分钟为间隔对它们进行分组,这样我得到的间隔为 0-5-10-15-20... 等等。间隔稍后将用作组标识符:

  Time                 Source  Value  Group
1 2016-01-20 15:10:04  C04     OPEN   10
2 2016-01-20 15:09:57  M04     true   5
3 2016-01-20 15:09:53  M02     true   5
4 2016-01-20 15:09:53  M03     true   5
5 2016-01-20 14:44:54  M04     true   40

我已经尝试使用breaks="5 min" 来cut() 日期,但不是得到圆形的开始和结束值,结果如下所示:

 > table(cut.POSIXt(df.formatted$Time, breaks="5 min"))[1:5]
 2015-12-31 12:49:00 2015-12-31 12:54:00 2015-12-31 12:59:00 2015-12-31 13:04:00 2015-12-31 13:09:00 
              4                   0                   0                   1                  15 

有没有办法告诉 cut() 使用圆形时间间隔?我也尝试使用 xts 包进行分组,但 OHLC 对我的帮助比对我的帮助更大。我还尝试使用 heR.Misc 包(请参阅time.factor documentation,但由于文档不足,我无法使其正常运行。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 我想到了一种方法,但 xts-objects 测试这个概念的数据输入阶段是 PITA。为什么不使用可传输的格式,例如 dput(head(object_name))

标签: r time-series grouping intervals cut


【解决方案1】:

首先,您需要安装“chron”包。该软件包具有minutes() 功能,可为您提供一分钟的时间。

我必须将第一列和第二列粘贴在一起,但我认为您也不必这样做。只使用tmpTime <- tmp[,1]

library(chron)

tmp <- read.table(text="Time  Source  Value
 2016-01-20 15:10:04  C04     OPEN
 2016-01-20 15:09:57  M04     true
 2016-01-20 15:09:53  M02     true
 2016-01-20 15:09:53  M03     true
 2016-01-20 14:44:54  M04     true", header=T, row.names= NULL)

tmpTime <- paste(tmp[,1], tmp[,2])

group <- seq(0,55,5)

sapply(tmpTime, function(x){
  x <- minutes(x)
  for(i in 2:length(group)){
    if(x < group[i]) {return(group[i-1]); break}
    else if(x >= group[length(group)]) return(group[length(group)])
  }
})

[1] 10  5  5  5 40

【讨论】:

  • 嘿 vck,您的解决方案效果很好!但是,在第 55 分钟对事件进行分组时,我得到了 NA 结果。所以我将 >-comparison 更改为 >=-comparison ,现在我得到了我想要的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 2013-06-28
  • 2014-07-20
  • 1970-01-01
  • 2014-07-17
  • 2023-03-07
相关资源
最近更新 更多