转换带时间戳的行数据时的性能问题

时间:2011-09-20 12:25:43

标签: r xts

我编写了一个函数,它接受一个data.frame,它代表1分钟时间范围内出现的数据间隔。该功能的目的是采用这些1分钟的间隔并将它们转换为更高的间隔。例如,1分钟变为5分钟,60分钟等......数据集本身有可能在数据中有间隙,即时间跳跃,因此它必须适应这些不良数据的出现。我编写了以下代码,它似乎有效,但在大型数据集上的性能非常糟糕。

我希望有人可以就如何加快这一点提出一些建议。见下文。

compressMinute = function(interval, DAT) {
    #Grab all data which begins at the same interval length
    retSet = NULL
    intervalFilter = which(DAT$time$min %% interval == 0)
    barSet = NULL
    for (x in intervalFilter) {
        barEndTime = DAT$time[x] + 60*interval
        barIntervals = DAT[x,]
        x = x+1
        while(x <= nrow(DAT) & DAT[x,"time"] < barEndTime) {
            barIntervals = rbind(barIntervals,DAT[x,])
            x = x + 1
        }
        bar = data.frame(date=barIntervals[1,"date"],time=barIntervals[1,"time"],open=barIntervals[1,"open"],high=max(barIntervals[1:nrow(barIntervals),"high"]),
                        low=min(barIntervals[1:nrow(barIntervals),"low"]),close=tail(barIntervals,1)$close,volume=sum(barIntervals[1:nrow(barIntervals),"volume"]))
        if (is.null(barSet)) {
            barSet = bar
        } else {
            barSet = rbind(barSet, bar)
        }

    }
    return(barSet)
}

编辑:

下面是我的一行数据。每行代表一个1分钟的间隔,我试图将其转换为任意桶,这是这些1分钟间隔的聚合,即5分钟,15分钟,60分钟,240分钟等...

date                time    open    high     low   close volume
2005-09-06 2005-09-06 16:33:00 1297.25 1297.50 1297.25 1297.25     98

1 个答案:

答案 0 :(得分:4)

您可能希望重新使用现有的设施,特别是POSIXct时间类型以及现有的套餐。

例如,查看xts包---它已经具有泛型函数to.period()以及便捷包装to.minutes()to.minutes3(),{{1} },....

以下是帮助页面中的示例:

to.minutes10()