2016-01-21 60 views
0

我有一个时间序列数据帧寻找这样的:如何在R中将时间序列数据分组为5分钟的循环间隔?

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 

我已经试图削减()的日期使用场所=“5分钟”而是获得轮开始值和结束值,结果如下:

> 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但由于差劲的文档我不能让它正常运行。

是否有人可能知道如何解决这个问题呢?

+0

我有一个办法,但xts对象的数据输入阶段来测试这个概念是一个PITA。为什么不使用可传输的格式,例如'dput(head(object_name))将实现'' –

回答

1

首先,你需要安装“历代志下”包裹,这个包裹有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 
+0

嘿vck,你的解决方案工作的非常好!然而,在第55分钟的比赛中,我得到了NA结果。所以我改变了> - 比较> = - 比较,现在我得到了我想要的。非常感谢你! – Meldamos

+0

@ Melmolos我现在纠正。 – vck

相关问题