r программирование, чтобы найти диапазон времени, используя простой способ - PullRequest
0 голосов
/ 19 мая 2018
#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")

#group the time per bour
df.test $date.hour <- cut(df.test $date.time, breaks="hour")
head(df.test)

#count how many people per hour
people.count <- df.test%>%group_by(date.hour)%>% summarize(count.user=n()) %>% arrange(count.user)
people.count

#find the smallest people and show the ralated hour
start.hour <- strptime(as.character(people.count$date.hour[1]),"%Y-%m-%d %H:%M:%S")

#convert time to numeric
num.start.hour <- gsub("[: -]", "" ,start.hour, perl=TRUE)
num.end <- as.numeric(as.POSIXct(start.hour))-1
#print(num.end)

#convert numeric to time
library(anytime)
anytime(num.end)

hr.range <- paste0(format(start.hour,"%H:%M:%S")," - ",format(num.end,"%H:%M:%S"))
hr.range

Я пытаюсь найти этот набор данных наименьшего временного диапазона.Это мой ожидаемый результат.Я просмотрел несколько сообщений, таких как, как разделить формат даты и времени Разделить дату и время и преобразовать числовое значение времени , преобразовать числовую переменную в POSIXct .Тем не менее, исходный набор данных имеет всего 3 столбца, и я сделал больше, и я думаю, что я могу потратить меньше времени на поиск диапазона часов для самых маленьких людей.Как упростить код и есть какие-либо предложения, которые могут дать тот же результат и облегчить понимание для начинающего.

hr.range
[1] "05:00:00 - 04:59:59"

Кроме того, мой последний ожидаемый результат - новый столбец, подобный этому, и сокращение дополнительных столбцов..

final.hr.range
    [1] "01:00:00 - 01:59:59"
    [2] "02:00:00 - 02:59:59"
    [3] "05:00:00 - 05:59:59"

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Можно использовать пакет 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")
0 голосов
/ 19 мая 2018

Почему бы не использовать пакет lubridate:

hr_text <- function(t) {
  h <- hour(hms(t))
  paste(h, ":00:00 - ", h, ":59:59", sep="")
}
df.test$final.hr.range <- sapply(df.test$time, hr_text)

> df.test$final.hr.range
[1] "1:00:00 - 1:59:59" "2:00:00 - 2:59:59" "2:00:00 - 2:59:59" "1:00:00 - 1:59:59"
[5] "1:00:00 - 1:59:59" "5:00:00 - 5:59:59"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...