Дата и время в R. настолько запутаны, что я просто хочу случайным образом сгенерировать 24-часовое время, а затем добавить к ним.
Случайная генерация:
library(lubridate)
hourTime <- as.list(format(seq.POSIXt(as.POSIXct(Sys.Date()),
as.POSIXct(Sys.Date()+1),
by = "5 min"),
"%H:%M", tz = "GMT"))
Попытка преобразовать в дату:
df$ARRIVALTIME <- replicate(1000, sample(hourTime, 1, replace=F))
Пытаюсь добавить к предыдущему разу:
df$TRETTIME <- df$ARRIVALTIME +
(hours(sample(1:3, 1000, replace=T)) + minutes(sample(1:60, 1000, replace=T)))
Я думаю, это не удается, потому что у меня нет объекта, отформатированного по времени. Как я могу добавить в ARRIVALTIME случайное время?
@MrFlick. Это от lubridate (обновил код). as.List таков, что я могу выбирать из него.
hourTime - это просто список символьных строк, не так ли?





Это проще - нижележащий POSIXt - это либо длинная форма / поэлементная POSIXlt (здесь бесполезна), либо компактная POSIXct, которая представляет собой просто двойную (также известную как numeric), которую вы можете выполнять «математически».
Так что создавайте время как хотите, а затем просто добавляйте реальные значения:
R> now <- Sys.time()
R> set.seed(123)
R> deltas <- cumsum(rnorm(5)) # just five N(0,1), added up
R>
R> now
[1] "2018-06-14 16:50:36.55687 CDT"
R>
R> now + deltas
[1] "2018-06-14 16:50:35.996404 CDT" "2018-06-14 16:50:35.766226 CDT"
[3] "2018-06-14 16:50:37.324935 CDT" "2018-06-14 16:50:37.395443 CDT"
[5] "2018-06-14 16:50:37.524731 CDT"
R>
Как только вы поймете базовые типы, дополнительные пакеты не потребуются. поскольку все работает за (дробные) секунды. Итак, чтобы добавить час, получится 60 * 60 и так далее. Дополнительные пакеты по-прежнему полезны: соглашения рабочий день, праздники и дополнительные парсеры.
Ваша проблема в фрагменте кода заключалась в том, что format() уничтожает объект Datetime: вы попросили R создать строку, что он и сделал. По ним вы больше не можете заниматься математикой. Итак, сначала посчитайте, а затем распечатайте или отформатируйте.
Не забывайте проверенный старый as.difftime - Sys.time() + as.difftime(1, units = "days"), если вы хотите сделать добавленные единицы (дни / часы / минуты / секунды) явными.
Конечно, но OP просил случайности.
Когда вы используете функцию формат, вы создаете символьную переменную, которая не может быть суммирована. Поэтому я бы посоветовал оставить его как POSIXt и при необходимости использовать как символ.
Кроме того, функции минут и часы из lubridate создают объект период, который преобразуется в число, когда он находится в списке (я не совсем понимаю эту часть здесь), и я не мог суммировать, используя списки.
В любом случае, если я правильно понимаю, мне удалось получить желаемые результаты, работая без списка (вы можете поместить результаты после одного, если можете) с кодом:
hourTime<-(seq.POSIXt(as.POSIXct(Sys.Date()),
as.POSIXct(Sys.Date()+1),
by = "5 min"))
ARRIVALTIME <- sample(hourTime, 1000, replace=T)
TRETTIME <- ARRIVALTIME +
(hours(sample(1:3, 1000, replace=T)) +
minutes(sample(1:60, 1000, replace=T)))
вместо replicate (1000, sample (hourTime, 1, replace = F)) я использовал sample (hourTime, 1000, replace = T), который, как мне кажется, работает таким же образом. оба работают
Откуда берутся
hours()иminutes()? Вы их писали? Почему у васas.list()вместоhourTime?