R 加快data.table中的逐行间隔更新/添加
这与中的问题相同,但现在我有兴趣加快我的功能。我将复制粘贴问题描述和我的R代码,每行大约运行36毫秒,这对于我的行数来说太长了 问题: 我有几个数据集,每个数据集的时间间隔如下: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
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