如何将时间间隔按天分成更小的间隔

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

我想将一个时间间隔分成更小的间隔,截止时间为每天中午 12:00。这是我的示例数据框:

dftest <- data.frame(
  Subj = c("XX001", "XX001", "XX002", "XX002"),
  Start = c("2023-12-07 03:55:00", "2023-12-10 15:45:00", "2023-12-14 10:10:00", "2023-12-16 23:38:00"),
  End = c("2023-12-09 13:04:00", "2023-12-11 19:25:00", "2023-12-14 11:59:00", "2023-12-20 00:19:00")
)
> dftest
   Subj               Start                 End
1 XX001 2023-12-07 03:55:00 2023-12-09 13:04:00
2 XX001 2023-12-10 15:45:00 2023-12-11 19:25:00
3 XX002 2023-12-14 10:10:00 2023-12-14 11:59:00
4 XX002 2023-12-16 23:38:00 2023-12-20 00:19:00

这是我的预期输出(以 XX001 为例):

> dftest_XX001
   Subj               Start                 End
1 XX001 2023-12-07 03:55:00 2023-12-07 12:00:00
2 XX001 2023-12-07 12:00:00 2023-12-08 12:00:00
3 XX001 2023-12-08 12:00:00 2023-12-09 13:04:00
...
...
...

如果之前有人问过这个问题,我深表歉意。非常感谢!

r datetime lubridate
1个回答
0
投票

disag
函数计算从开始日期时间、每个中间日期的中午到结束日期时间的间隔的边界值
bounds
。然后,它确保它们位于开始日期时间和结束日期时间之间的闭/闭区间内,并且它们是唯一的。如果只剩下一个边界,则使用该边界,否则删除起始值和结束值的最后一个和第一个。

library(dplyr)

disag <- function(st, en) {
  st1 <- as.POSIXct(st)
  en1 <- as.POSIXct(en)

  bounds <- c(st1, 
    seq(trunc(st1, "day")-12*60*60, trunc(en1, "day")+12*60*60, by = 24*60*60),   en1) %>%
    pmax(st1, .) %>%
    pmin(en1, .) %>%
    unique

  if (length(bounds) == 1) {
    st2 <- en2 <- bounds 
  } else {
    st2 <- head(bounds, -1)
    en2 <- tail(bounds, -1)
  }
  data.frame(st2, en2) 
}


dftest %>% 
  rowwise %>%
  reframe(Subj = Subj, disag(Start, End))
© www.soinside.com 2019 - 2024. All rights reserved.