Добавление времени ко времени в R

Дата и время в 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 случайное время?

Откуда берутся hours() и minutes()? Вы их писали? Почему у вас as.list() вместо hourTime?

MrFlick 14.06.2018 23:49

@MrFlick. Это от lubridate (обновил код). as.List таков, что я могу выбирать из него.

Sebastian Zeki 14.06.2018 23:52
hourTime - это просто список символьных строк, не так ли?
thelatemail 14.06.2018 23:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
6 072
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это проще - нижележащий 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"), если вы хотите сделать добавленные единицы (дни / часы / минуты / секунды) явными.

thelatemail 14.06.2018 23:56

Конечно, но OP просил случайности.

Dirk Eddelbuettel 14.06.2018 23:57
Ответ принят как подходящий

Когда вы используете функцию формат, вы создаете символьную переменную, которая не может быть суммирована. Поэтому я бы посоветовал оставить его как 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), который, как мне кажется, работает таким же образом. оба работают

André Costa 15.06.2018 00:36

Другие вопросы по теме