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

R 加快data.table中的逐行间隔更新/添加,r,data.table,intervals,R,Data.table,Intervals,这与中的问题相同,但现在我有兴趣加快我的功能。我将复制粘贴问题描述和我的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

这与中的问题相同,但现在我有兴趣加快我的功能。我将复制粘贴问题描述和我的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)
}
#逐行计算时差:
软天数未测试

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))
}
库(dplyr)
计算时间间隔%
筛选器(开始%
变异(
delta=pmin(configEndDate,end)-pmax(configStartDate,start)
) %>%
汇总(总计=总和(增量))
}

看看
?foverlaps