在data.table中加快逐行间隔更新/添加

时间:2015-10-12 21:05:57

标签: r data.table intervals

这与this question中的问题相同,但现在我有兴趣加快我的功能。我将复制粘贴问题描述和我的R代码,每行运行大约36毫秒,这对于我的行数来说太长了。

问题:

我有一些数据集,每个数据集的时间间隔如下:

        configStartDate            configEndDate
2012-06-07 10:38:01.000  2012-06-11 13:35:25.000
2012-07-12 20:00:55.000  2012-07-17 10:17:53.000
2012-07-18 12:44:15.000  2012-07-20 02:15:47.000
2012-07-20 02:15:47.000  2012-10-05 10:35:19.000
2012-10-05 10:35:19.000  2012-11-13 10:44:24.000

我需要编写一个查询函数(在R中,但我现在只是弄清楚逻辑;在Python中进行原型设计),这需要两个自定义的开始和结束日期,并总结两者之间的间隔。

问题是查询日期可能从中间或时间块之外开始。因此,例如,在上面的示例中,我的查询可能是2012-06-09和2012-11-11的时间间隔,在这种情况下,我必须修改第一个和最后一个块的开始和结束日期。但是,第一个间隔也可以在第二个块等的中间开始,等等。

R代码:

# calculating time differences row-by-row:
soft_days <- soft_days[, 
  .(soft_days = calc_sw_intervals(soft_dt = soft_install_model, 
                                  start_query = start_q,
                                  end_query = end_q,
                                  assetID = assetId,
                                  soft_mm = soft_major_minor), 
  by = c('assetId', 'soft_major_minor')
]


# code to sum up (custom) time intervals:
calc_sw_intervals <- function(soft_dt, start_query, end_query, assetID, soft_mm, dType = 1){
  start_query <- ymd(start_query)
  end_query <- ymd(end_query)

  soft_dt <- soft_dt[assetId == assetID & soft_major_minor %in% soft_mm
                                  & configEndDate > start_query
                                  & configStartDate < end_query
                                  & deviceType == dType
                                  ,list(configStartDate, configEndDate)
                                  ]

  if(dim(soft_dt)[1] == 0)
    return(NaN)

  soft_dt[1, configStartDate := max(start_query, configStartDate)]
  soft_dt[.N, configEndDate := min(end_query, configEndDate)]

  total_days <- soft_dt[, sum(as.numeric(difftime(configEndDate, configStartDate, units = 'days')))]
  return(total_days)
}

代码所做的是找到间隔结束的所有时间间隔> start_query,间隔的开始是&lt; end_query;然后它会根据需要更新第一个/最后一个间隔的开始和结束(如果查询开始和结束在第一个和最后一个间隔内),并总结间隔内的时间差异。

任何一种聪明的加速都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

未测试

library(dplyr)
calc_sw_intervals <- function(df, start, end){
  df %>% 
    filter(start < configEndDate, configStartDate < end) %>%
    mutate(
      delta = pmin(configEndDate, end) - pmax(configStartDate, start)
    ) %>%
    summarise(Total = sum(delta))
}