在R中计算每个会话在特定时间段内的分钟数

pkwftd7m  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(105)

这是示例数据集。

StartTime   EndTime User
5/18/2023 2:40  5/18/2023 4:44  FJNDS
5/18/2023 4:04  5/18/2023 5:07  DFDSFDS
5/18/2023 5:07  5/18/2023 5:13  CXXZVC
5/18/2023 1:40  5/18/2023 5:41  SAFDSFD
5/18/2023 1:40  5/18/2023 5:41  VCXZVXC
5/18/2023 4:31  5/19/2023 5:47  VDSFSDFD

每行对应一个会话。我想知道是否有任何一个会议福尔斯在3:00到6:00之间。如果任何会话/行福尔斯在该时间段之间,则该时间段内的分钟数需要在列中单独注明。
请注意,在最后一行(user id == VDSFSDFD)中,会话在两天之间。因此,在这种情况下,需要记录两天的3:00到6:00时间段之间的总分钟数。
可以在R中使用Lubridate吗?其他的R函数对我来说也很好。

xt0899hw

xt0899hw1#

df <- data.frame(   StartTime = c("5/18/2023 2:40", "5/18/2023 4:04", "5/18/2023 5:07", "5/18/2023 1:40", "5/18/2023 1:40", "5/18/2023 4:31"),   EndTime = c("5/18/2023 4:44", "5/18/2023 5:07", "5/18/2023 5:13", "5/18/2023 5:41", "5/18/2023 5:41", "5/19/2023 5:47"),   User = c("FJNDS", "DFDSFDS", "CXXZVC", "SAFDSFD", "VCXZVXC", "VDSFSDFD") )

使用as.POSIXct函数将StartTime和EndTime列转换为适当的日期时间格式:

df$StartTime <- as.POSIXct(df$StartTime, format = "%m/%d/%Y %H:%M")
df$EndTime <- as.POSIXct(df$EndTime, format = "%m/%d/%Y %H:%M")

创建一个名为MinutesInRange的新列,并为所有行分配值0:

df$MinutesInRange <- 0

处理会话跨越2天的情况:

df$MinutesInRange <- as.numeric(ifelse(round(as.numeric(difftime(df$EndTime, df$StartTime, units = "days"))) >= 1,
                                       abs(as.numeric(difftime(df$StartTime, as.POSIXct(paste0(format(df$StartTime, "%Y-%m-%d"), " 06:00:00")), units = "mins"))),
                                       0)+
                                  ifelse(round(as.numeric(difftime(df$EndTime, df$StartTime, units = "days"))) >= 1,
                                         abs(as.numeric(difftime(df$EndTime, as.POSIXct(paste0(format(df$EndTime, "%Y-%m-%d"), " 03:00:00")), units = "mins"))),
                                         0))

通过使用ifelse函数检查每个会话是否福尔斯3:00到6:00的时间段内来处理其余情况。如果是,则计算该时间段内的分钟数,并将其分配给MinutesInRange列:

df$MinutesInRange <- ifelse(
  format(df$StartTime, "%H:%M") >= "03:00" & format(df$EndTime, "%H:%M") <= "06:00",
  as.numeric(difftime(df$EndTime, df$StartTime, units = "mins")),
  df$MinutesInRange
)

这就是结果:

df
            StartTime             EndTime     User MinutesInRange
1 2023-05-18 02:40:00 2023-05-18 04:44:00    FJNDS              0
2 2023-05-18 04:04:00 2023-05-18 05:07:00  DFDSFDS             63
3 2023-05-18 05:07:00 2023-05-18 05:13:00   CXXZVC              6
4 2023-05-18 01:40:00 2023-05-18 05:41:00  SAFDSFD              0
5 2023-05-18 01:40:00 2023-05-18 05:41:00  VCXZVXC              0
6 2023-05-18 04:31:00 2023-05-19 05:47:00 VDSFSDFD            256

相关问题