以R为单位合并重叠的时间段

问题描述 投票:0回答:1

我正在尝试找到一种方法来合并可以处理毫秒的重叠时间间隔。

[这里发布了三个潜在选项:How to flatten / merge overlapping time periods

但是,我不需要按ID分组,因此发现dplyrdata.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

建议将不胜感激!

r datetime lubridate posixct
1个回答
0
投票

我发现如果使用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创建

© www.soinside.com 2019 - 2024. All rights reserved.