Разделить продолжительность интервала в календарных днях - PullRequest
3 голосов
/ 23 августа 2011

У меня есть следующий набор данных, который показывает начало и конец эпизода (дата и время)

ep <- data.frame(start=c("2009-07-13 23:45:00", "2009-08-14 08:30:00", 
                         "2009-09-16 15:30:00"), 
                 end=c("2009-07-14 00:03:00", "2009-08-15 08:35:00", 
                       "2009-09-19 07:30:00"))

Мне нужно преобразовать его во фрейм данных, который бы показывал в каждом календарном дне, сколько минут было эпизодов. Для приведенного выше примера это будет:

2009-07-13  15
2009-07-14  3
2009-08-14  930
2009-08-15  515
2009-09-16  510
2009-09-17  1440
2009-09-18  1440
2009-09-19  450

Я ценю любую помощь

1 Ответ

2 голосов
/ 23 августа 2011

Это работает, но кажется немного не элегантным. Сначала создайте вектор, представляющий собой последовательность времен между каждым временем начала и окончания по минутам:

tmp <- do.call(c, apply(ep, 1, 
                        function(x) head(seq(from = as.POSIXct(x[1]), 
                                             to = as.POSIXct(x[2]),by = "mins"), 
                                         -1)))

Мы используем head(...., -1) для удаления последней минуты из каждой последовательности, чтобы минуты соответствовали желаемому.

Затем разделите этот вектор на минуты, приходящиеся на отдельные дни, и посчитайте, сколько минут в день:

tmp <- sapply(split(tmp, format(tmp, format = "%Y-%m-%d")), length)

Обратите внимание, что по какой-то причине (возможно, связанной с часовым поясом), которую мы не можем просто использовать as.Date(tmp), чтобы получить вектор дат, нам нужно явно отформатировать время, чтобы показать только части даты.

Последний шаг - упорядочить объект tmp, содержащий все, что нам нужно, в запрошенный вами формат:

mins <- data.frame(Date = names(tmp), Minutes = tmp, row.names = NULL)

Это дает:

> mins
        Date Minutes
1 2009-07-13      15
2 2009-07-14       3
3 2009-08-14     930
4 2009-08-15     515
5 2009-09-16     510
6 2009-09-17    1440
7 2009-09-18    1440
8 2009-09-19     450
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...