我正在尝试计算R中每小时的占用率。为此,我需要一次会议的分钟数(开始时间和结束时间之差),然后将其除以60分钟乘以100%。
当结束时间与开始时间不同时,我很难计算出该时间。
例如: 会议时间是从12.50到13.10,然后R表示会议是20分钟(的确如此!),但我想每小时进行一次拆分。因此,应该在12:00-13:00钟点10分钟,在13.00-14.00钟点10分钟
Start_Time End_Time occupied Room_ID
1 2019-09-02 09:03:00 2019-09-02 10:32:00 1 7820
2 2019-09-02 10:35:00 2019-09-02 11:06:00 1 7820
3 2019-09-02 11:29:00 2019-09-02 12:20:00 1 7820
4 2019-09-02 12:42:00 2019-09-02 13:09:00 1 7820
5 2019-09-02 14:07:00 2019-09-02 14:22:00 1 7820
6 2019-09-02 14:22:00 2019-09-02 14:27:00 1 7820
7 2019-09-02 14:56:00 2019-09-02 15:18:00 1 7820
如果我使用difftime(),它将在第一行中存储89分钟,我想对其进行划分。我该怎么办?
答案 0 :(得分:0)
仅在此数据上使用base R函数:
data <- data.frame(
Start_Time = as.POSIXct(c("2019-09-02 09:03:00","2019-09-02 10:35:00","2019-09-02 11:29:00","2019-09-02 12:42:00","2019-09-02 14:07:00","2019-09-02 14:22:00","2019-09-02 14:56:00"),tz = "UTC"),
End_Time = as.POSIXct(c("2019-09-02 10:32:00","2019-09-02 11:06:00","2019-09-02 12:20:00","2019-09-02 13:09:0","2019-09-02 14:22:00","2019-09-02 14:27:00","2019-09-02 15:18:00"),tz = "UTC"),
Room_ID = 1)
解决方案可能是:
occupancy_rate <- function(data){
agg <- do.call(rbind,lapply(1:nrow(data),function(i){
times <- seq(data$Start_Time[i], data$End_Time[i], by = 60)
aggregate(list(occ_mins=times),list(date_hour=strftime(times,"%y-%m-%d %H")), length)
}))
with(agg,aggregate(list(occ_mins=occ_mins), list(date_hour=date_hour), function(x) sum(x)/60*100))
}
哪个会产生:
occupancy_rate(data)
date_hour occupancy_rate
1 19-09-02 10 95.00000
2 19-09-02 11 96.66667
3 19-09-02 12 63.33333
4 19-09-02 13 65.00000
5 19-09-02 14 16.66667
6 19-09-02 15 43.33333
7 19-09-02 16 31.66667
很显然,如果数据集更大,您可能希望查看外部库,例如data.table
或dplyr