R агрегировать данные за 10 минут раунда

#r #dataframe #time-series #dplyr #data-processing

#r #фрейм данных #временные ряды #dplyr #обработка данных

Вопрос:

У меня есть R dataframe, df , вот так:

     WIFIAPTag          passengerCount      timeStamp            MAC
1    E1-1A-1<E1-1-01>       15       2016-09-10 18:55:04    5869.6c54.d040
750  E1-1A-1<E1-1-01>       14       2016-09-10 18:56:01    5869.6c54.d040
1499 E1-1A-1<E1-1-01>       18       2016-09-10 18:57:01    5869.6c54.d040 
2248 E1-1A-1<E1-1-01>       17       2016-09-10 18:58:02    5869.6c54.d040 
2997 E1-1A-1<E1-1-01>       17       2016-09-10 18:59:01    5869.6c54.d040 
3746 E1-1A-1<E1-1-01>       14       2016-09-10 19:00:01    5869.6c54.d040 
3746 E1-1A-1<E1-1-01>       1        2016-09-10 19:05:01    5869.6c54.d040 
  

Теперь я хочу агрегировать этот фрейм данных каждые 10 минут, вот так:

     WIFIAPTag          passengerCount      timeStamp            MAC
1    E1-1A-1<E1-1-01>       81       2016-09-10 18:50:00    5869.6c54.d040
2    E1-1A-1<E1-1-01>       15       2016-09-10 19:00:00    5869.6c54.d040 
  

Я использую aggregate и cut в R вот так:

 output <- aggregate(passengerCount ~ cut(timeStamp, breaks = "10 mins"), df, sum)
  

Но я могу получить данные только с начала 2016-09-10 18:55:00 :

 output
    WIFIAPTag           timeStamp passengerCount
1 E1-1A-1<E1-1-01> 2016-09-10 18:55:00             95
2 E1-1A-1<E1-1-01> 2016-09-10 19:05:00             1
  

С чего я могу начать вывод 2016-09-10 18:50:00 ?

Комментарии:

1. если вы зададите разрывам значение like "10 mins" , оно разделит интервал на это, используя первую и последнюю дату. Вместо этого явно выберите перерывы: seq.POSIXt(as.POSIXct('2016-09-10 18:50:00'),as.POSIXct('2016-09-10 23:50:00'),by = 600) например

2. Это сработало! Как насчет ответа ниже, чтобы я мог его принять?

Ответ №1:

Присвоение значения для перерывов типа «10 минут» приведет к разделению интервала с использованием первой и последней даты на 10-минутные сегменты.

Вместо этого явно выбирайте перерывы:

(Используя lubridate, поскольку я предпочитаю не жестко кодировать самые низкие и самые высокие значения)

 library(lubridate)

lowtime <- min(df$timeStamp)
hightime <- max(df$timeStamp)

# Set the minute and second to the nearest 10 minute value
minute(lowtime) <- floor(minute(lowtime)/10) * 10
minute(hightime) <- ceiling(minute(hightime)/10) * 10
second(lowtime) <- 0
second(hightime) <- 0

# Set the breakpoints at 10 minute intervals
breakpoints <- seq.POSIXt(lowtime, hightime, by = 600)
output <- aggregate(passengerCount ~ cut(timeStamp, breaks = breakpoints), df, sum)