R语言 如何将一个时间间隔按天分成更小的时间间隔

ddrv8njm  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(72)

我想把一个时间间隔分成更小的时间间隔,每天的截止时间是12:00 pm。下面是我的例子:

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")
)

个字符
下面是我的预期输出(以XX 001为例):

> 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
...
...
...


如果之前有人问过我很抱歉。非常感谢!

hgb9j2n6

hgb9j2n61#

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

library(dplyr)

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

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

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

dftest %>% 
  rowwise %>%
  reframe(Subj = Subj, disag(Start, End))

字符串

相关问题