Рассчитать последовательность событий 15 минут между двумя датами и временем - PullRequest
1 голос
/ 29 марта 2019

У меня есть таблица времени и даты, и я хочу добавить новый фрейм данных в часах с 00:00 до 00:00 в последовательности по 15 минут для каждой строки, например, 00:00, 00:15,... 23:45, где я пытаюсь узнать, сколько раз работник работал в своем графике.

Обратите внимание, что формат даты и времени d-m-Y h:m

у меня (изменено намои данные)

worker           Start_shift        End_shift          difference        
Worker  130    30-05-2018 15:00   01-06-2018 08:15   41.25     
Worker  130    15-06-2018 15:00   16-06-2018 09:00   18.00     
Worker  130    22-03-2018 15:00   23-03-2018 08:15   17.25     
Worker  130    27-02-2018 15:00   28-02-2018 10:00   19.00     
Worker  130    30-05-2018 15:00   01-06-2018 08:15   41.25     
Worker  18    27-04-2018 15:00   29-04-2018 07:24   40.40     
Worker  11    29-03-2018 16:00   31-03-2018 07:24   39.40     
Worker  11    25-03-2018 16:00   27-03-2018 07:24   39.40     

Я хочу иметь новый фрейм данных для этого вывода.Где я могу видеть, сколько они работают в разных временных метках

Это всего лишь пример желаемого вывода , а не истинный вывод вышеуказанного набора данных.Приведенные ниже значения могут быть неправильными.

            00:00 | 00:15 | 00:30 | ... | 23:45 
worker 130     5      5       6       ..    4
worker 18      2      5       5       ..    3
worker 11      1      1       1       ..    1

Я попытался создать 15-минутную последовательность с помощью вызова seq ().

seq15 <- seq(lubridate::as_datetime(paste0(DATE_Start, " 00:00:00"), format="%Y-%m-%d %H:%M:%S", tz = "UTC"), lubridate::as_datetime(paste0(DATE_End, " 00:00:00"), format="%Y-%m-%d %H:%M:%S", tz = "UTC"), by = "15 mins")

Однако с более длинными сменами я не могу сложить вместе временные метки

Любая помощь будет оценена

dput ниже

structure(list(Start_shift = c("30-05-2018 15:00", "15-06-2018 15:00", 
"22-03-2018 15:00", "27-02-2018 15:00", "30-05-2018 15:00", "27-04-2018 15:00", 
"29-03-2018 16:00", "29-03-2018 16:00"), End_shift = c("01-06-2018 08:15", 
"16-06-2018 09:00", "23-03-2018 08:15", "28-02-2018 10:00", "01-06-2018 08:15", 
"29-04-2018 07:24", "31-03-2018 07:24", "31-03-2018 07:24"), 
    difference = structure(c(41.25, 18, 17.25, 19, 41.25, 40.4, 
    39.4, 39.4), class = "difftime", units = "mins"), worker = structure(c(30L, 
    30L, 30L, 30L, 30L, 8L, 1L, 1L), .Label = c("Worker  11", 
    "Worker  12", "Worker  13", "Worker  14", "Worker  15", "Worker  16", 
    "Worker  17", "Worker  18", "Worker  19", "Worker  110", 
    "Worker  111", "Worker  112", "Worker  113", "Worker  114", 
    "Worker  115", "Worker  116", "Worker  117", "Worker  118", 
    "Worker  119", "Worker  120", "Worker  121", "Worker  122", 
    "Worker  123", "Worker  124", "Worker  125", "Worker  126", 
    "Worker  127", "Worker  128", "Worker  129", "Worker  130", 
    "Worker  131", "Worker  132", "Worker  133", "Worker  134", 
    "Worker  135", "Worker  136", "Worker  137", "Worker  138", 
    "Worker  139", "Worker  140"), class = "factor")), row.names = c(7052L, 
7053L, 7054L, 7055L, 7074L, 1767L, 21L, 58L), class = "data.frame")

1 Ответ

1 голос
/ 29 марта 2019

Я использую данные, которые вы разместили как dt:

library(tidyverse)
library(lubridate)


dt %>%
  mutate(Start_shift = dmy_hm(Start_shift),
         End_shift = dmy_hm(End_shift)) %>%           # update to datetime
  rowwise() %>%                                       # for each row
  mutate(date_vec = list(seq(Start_shift, 
                             End_shift, 
                             by = "15 mins"))) %>%    # create a vector of 15 min distance date-times
  ungroup() %>%                                       # forget the grouping
  unnest() %>%                                        # unnest vector of date-times
  mutate(time = substr(date_vec, 12,16)) %>%          # keep only hr-mins
  count(worker, time) %>%                             # count combinations
  spread(time, n)                                     # reshape

И альтернативное, немного более компактное, решение, которое использует map для замены rowwise при генерации даты-векторные векторы и время в часах:

dt %>%
  mutate(Start_shift = dmy_hm(Start_shift),
         End_shift = dmy_hm(End_shift),      
         time = map2(Start_shift, End_shift, ~substr(seq(.x, .y, by = "15 mins"), 12, 16))) %>%
  unnest(time) %>%
  count(worker, time) %>%                          
  spread(time, n)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...