这与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
;然后它会根据需要更新第一个/最后一个间隔的开始和结束(如果查询开始和结束在第一个和最后一个间隔内),并总结间隔内的时间差异。
任何一种聪明的加速都会受到赞赏。
答案 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))
}