Как рассчитать заполняемость в час?

Я пытаюсь рассчитать заполняемость в час в R. Для этого мне нужны минуты одного собрания (разница во времени начала и окончания) и разделить их на 60 минут, умноженные на 100%.

У меня проблемы с расчетом, когда время окончания находится в другом часе, чем время начала.

Например: собрание проходит с 12.50 до 13.10, тогда R говорит, что собрание длится 20 минут (что верно!), Но я хочу разделить его на час. Таким образом, 10 минут должны быть в 12.00-13.00 часов и 10 минут в 13.00-14.00.

                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 минут в первой строке, которую я хочу разделить. Что я могу сделать?


person Community    schedule 25.10.2019    source источник
comment
Используйте cut(x, breaks = '60 min'), где x - ваша переменная даты   -  person Sotos    schedule 25.10.2019
comment
Вы также можете посмотреть пакет lubridate, в котором есть много инструментов для работы с датой и временем. Вот хорошая шпаргалка: evoldyn.gitlab.io/evomics-2018 /ref-sheets/R_lubridate.pdf   -  person cbo    schedule 25.10.2019


Ответы (1)


Использование только базовых функций 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.

person rookie    schedule 25.10.2019