提高将R数据帧中的时间戳分配给预定义间隔的性能

时间:2016-07-08 12:24:01

标签: r performance dataframe lubridate

假设你有

  • 已定义的命名,非重叠间隔列表(例如季度或软件发布周期)
  • 包含带时间戳的交易的大型数据框dfTransactionDatadfTransactionData$instantId

并且您希望将列intervalId添加到大数据框中,该数据框将每个行/事务分配到它发生的间隔。

下面你可以看到我的临时解决方案正常工作,但速度很慢。我真的很感激能够更快地解决这个问题。

library("lubridate")
config <- new.env(parent = emptyenv())
config$intervals <- list(
  "v4"   = interval(ymd_hms("2001-01-01 00:00:00"),           ymd_hms("2003-06-01 23:09:40.165365+02")),
  "v5"   = interval(ymd_hms("2003-06-01 23:09:40.165366+02"), ymd_hms("2004-02-27 11:48:41.065424+01")),
  "v6"   = interval(ymd_hms("2004-02-27 11:48:41.065425+01"), ymd_hms("2015-06-25 20:36:49.069505+02"))
)

dfTransactionData <- data.frame(instantId = format(seq(from=as.Date('2001-01-01 00:00:00', format="%Y-%m-%d %H:%M:%S"), by='day', length.out=10000 ), format="%Y-%m-%d %H:%M:%S"))

TimesplitTransactionData <- function(dfTransactionData) {
  intervals   <- config$intervals
  intervalIds <- names(config$intervals)
  intervalSeq <- seq_along(intervals)
  dfTransactionData$intervalId <- apply(dfTransactionData,1,function(row) {
    for (i in intervalSeq) {
      if (fast_strptime(row["instantId"], "%Y-%m-%d %H:%M:%S") %within% intervals[[i]]) {
        return(intervalIds[i])
      }
    }
    return(NA)
  })
  return(dfTransactionData)
}

TimesplitTransactionData(dfTransactionData)

0 个答案:

没有答案