Можно использовать пакет lubridate
для получения часового диапазона данных.floor_date
предоставит вам начальный час времени, ceiling_date
минус 1 предоставит вам последнюю секунду этого часа.Затем используйте interval
, чтобы создать интервал представления этого конкретного часа.Я не уверен, что OP намерен оставить date
частью interval
, но я сохранил date
как часть интервала.Наконец, group_by
будет отлично работать на интервале.
Следовательно, вы можете использовать его как:
library(dplyr)
library(lubridate)
Опция № 1: Диапазон включает в себя оба Date/Time
df.test %>% mutate(final.hr.range = interval(floor_date( date.time, "hour"),
ceiling_date( date.time, "hour") - 1))
# id time date.time final.hr.range
# 1 1 01:30:00 2018-05-19 01:30:00 2018-05-19 01:00:00 BST--2018-05-19 01:59:59 BST
# 2 2 02:05:00 2018-05-19 02:05:00 2018-05-19 02:00:00 BST--2018-05-19 02:59:59 BST
# 3 2 02:40:01 2018-05-19 02:40:01 2018-05-19 02:00:00 BST--2018-05-19 02:59:59 BST
# 4 1 01:44:01 2018-05-19 01:44:01 2018-05-19 01:00:00 BST--2018-05-19 01:59:59 BST
# 5 1 01:33:01 2018-05-19 01:33:01 2018-05-19 01:00:00 BST--2018-05-19 01:59:59 BST
# 6 1 05:00:01 2018-05-19 05:00:01 2018-05-19 05:00:00 BST--2018-05-19 05:59:59 BST
Опция № 2: Диапазон в %H:%M:%S
формате
df.test %>% mutate(final.hr.range =
paste(format(floor_date( date.time, "hour"), "%H:%M:%S"),
format(floor_date( date.time, "hour") + 3599, "%H:%M:%S"),
sep = " - "))
# id time date.time final.hr.range
# 1 1 01:30:00 2018-05-19 01:30:00 01:00:00 - 01:59:59
# 2 2 02:05:00 2018-05-19 02:05:00 02:00:00 - 02:59:59
# 3 2 02:40:01 2018-05-19 02:40:01 02:00:00 - 02:59:59
# 4 1 01:44:01 2018-05-19 01:44:01 01:00:00 - 01:59:59
# 5 1 01:33:01 2018-05-19 01:33:01 01:00:00 - 01:59:59
# 6 1 05:00:01 2018-05-19 05:00:01 05:00:00 - 05:59:59
Данные: Взято из OP
#sample data
df.test <- data.frame(id = c(1,2,2,1,1,1),
time=c("01:30:00","02:05:00","02:40:01","01:44:01","01:33:01","05:00:01"))
df.test $date.time <- as.POSIXct(df.test $time,format="%H:%M:%S")