我正在尝试找到一种方法来合并可以处理毫秒的重叠时间间隔。
[这里发布了三个潜在选项:How to flatten / merge overlapping time periods
但是,我不需要按ID分组,因此发现dplyr
和data.table
方法令人困惑(我不确定它们是否可以处理毫秒,因为我无法使它们工作)。
我设法使IRanges
解决方案起作用,但是它将POSIXct
对象转换为as.numeric
整数以计算重叠。所以,我假设这就是为什么输出中不存在毫秒的原因?
缺少毫秒似乎不是显示问题,因为当我减去结果的开始和结束时间时,我得到的整数结果以秒为单位。
这里是我的数据示例:
start <- c("2019-07-15 21:32:43.565",
"2019-07-15 21:32:43.634",
"2019-07-15 21:32:54.301",
"2019-07-15 21:34:08.506",
"2019-07-15 21:34:09.957")
end <- c("2019-07-15 21:32:48.445",
"2019-07-15 21:32:49.045",
"2019-07-15 21:32:54.801",
"2019-07-15 21:34:10.111",
"2019-07-15 21:34:10.236")
df <- data.frame(start, end)
我从IRanges
解决方案获得的输出:
start end
1 2019-07-15 21:32:43 2019-07-15 21:32:49
2 2019-07-15 21:32:54 2019-07-15 21:32:54
3 2019-07-15 21:34:08 2019-07-15 21:34:10
以及期望的结果:
start end
1 2019-07-15 21:32:43.565 2019-07-15 21:32:49.045
2 2019-07-15 21:32:54.301 2019-07-15 21:32:54.801
3 2019-07-15 21:34:08.506 2019-07-15 21:34:10.236
建议将不胜感激!
我发现如果使用POSIXlt
格式,保留毫秒非常容易。尽管有更快的方法来计算重叠,但对于大多数用途而言,它仅循环遍历数据帧就足够了。
这是一个可复制的示例。请注意,在问题中给定的时间间隔中,最后两个实际上并不重叠,因此问题中的预期输出似乎不正确。
start <- c("2019-07-15 21:32:43.565",
"2019-07-15 21:32:43.634",
"2019-07-15 21:32:54.301",
"2019-07-15 21:34:08.506",
"2019-07-15 21:34:09.957")
end <- c("2019-07-15 21:32:48.445",
"2019-07-15 21:32:49.045",
"2019-07-15 21:32:54.801",
"2019-07-15 21:34:08.676",
"2019-07-15 21:34:10.236")
df <- data.frame(start = as.POSIXlt(start), end = as.POSIXlt(end))
i <- 1
while(i < nrow(df))
{
overlaps <- which(df$start < df$end[i] & df$end > df$start[i])
if(length(overlaps) > 1)
{
df$end[i] <- max(df$end[overlaps])
df <- df[-overlaps[-which(overlaps == i)], ]
i <- i - 1
}
i <- i + 1
}
现在我们可以看到我们的数据框已经合并了两个重叠的周期,但是毫秒似乎已经过去了:
df
#> start end
#> 1 2019-07-15 21:32:43 2019-07-15 21:32:49
#> 3 2019-07-15 21:32:54 2019-07-15 21:32:54
#> 4 2019-07-15 21:34:08 2019-07-15 21:34:08
#> 5 2019-07-15 21:34:09 2019-07-15 21:34:10
但是,我们现在可以看到这只是一个显示问题:
df$end - df$start
#> Time differences in secs
#> [1] 5.4800000 0.5000000 0.1700001 0.2790000
as.numeric(df$end - df$start)
#> [1] 5.4800000 0.5000000 0.1700001 0.2790000
由reprex package(v0.3.0)在2020-02-20创建