Дата-Время/ день манипуляции в R
У меня есть регулярные 5-минутные интервальные наборы данных datetime (около 50). Функции POSIXt/ lubridate
очень хорошо преобразуют мои данные и время в 24-часовой формат по мере необходимости. Но я хотел бы добавить еще одну колонку с определением моего дня, чтобы быть с 6 утра до 6 утра (что в настоящее время полночь до полуночи). Я пытаюсь сделать это, чтобы захватить активность после 12 утра как часть текущей даты, а не следующей.
В настоящее время я пытаюсь создать группу каждый 288-й ряд (есть 288 5-минутных интервалов в a день). Но это создает проблему, потому что мои наборы данных не обязательно начинаются в уникальное время.
Я не хочу создавать смещения, потому что это искажает значения, соответствующие времени.
Есть ли эффективные способы обойти эту проблему? Спасибо.
2 ответа:
Вы можете эффективно сделать это, сначала генерируя
seq
влияние даты / времени, а затем используяcut
, чтобы найти ячейку, в которую попадает каждое значение:set.seed(2) dat <- Sys.time() + sort(runif(10, min=0, max=5*24*60*60)) dat # [1] "2017-07-29 15:43:10 PDT" "2017-07-29 20:23:12 PDT" "2017-07-29 22:24:22 PDT" "2017-07-31 08:22:57 PDT" # [5] "2017-07-31 18:13:06 PDT" "2017-07-31 21:01:10 PDT" "2017-08-01 12:30:19 PDT" "2017-08-02 04:14:03 PDT" # [9] "2017-08-02 17:26:14 PDT" "2017-08-02 17:28:52 PDT" sixs <- seq(as.POSIXct("2017-07-29 06:00:00", tz = "UTC"), as.POSIXct("2017-08-03 06:00:00", tz = "UTC"), by = "day") sixs # [1] "2017-07-29 06:00:00 UTC" "2017-07-30 06:00:00 UTC" "2017-07-31 06:00:00 UTC" "2017-08-01 06:00:00 UTC" # [5] "2017-08-02 06:00:00 UTC" "2017-08-03 06:00:00 UTC" cut(dat, sixs, label = FALSE) # [1] 1 1 1 3 3 3 4 5 5 5
В соответствии со страницей справки (
?seq.POSIXt
), Вы можете выбратьby="DSTday"
вместо этого.
Поскольку я не могу комментировать (вопрос репутации, новый участник здесь), я публикую это в качестве ответа.
Это иллюстрирует более надежное решение, поскольку оно не зависит от структуры данных (например, повтор).
Проверьте этот вопрос и соответствующий ответ: Как манипулировать временной частью столбца даты?Следующее решение @meenaparam :
Преобразуйте все столбцы дат в формат
dmy_hms
из пакетаlubridate
. Пожалуйста, изучите другие варианты например,dmy_hm
илиymd_hms
и т. д., В соответствии с вашей конкретной потребностью.Теперь создайте столбец для определения точек данных, которые необходимо изменить различными способами. Как и ваши точки данных с 00: 00:00 до 05:59: 59 (hms) должны быть частью предыдущей даты.mutate(DATE = dmy_hms(DATE))
DAY_PAST = case_when(hour(DATE) < 6 ~ "yup", TRUE ~ "nope"))
Теперь преобразуем
day
значение этих"yup"
дат вday(DATE)-1
NEW_DATE = case_when(DAY_PAST == "yup" ~ make_datetime(year(DATE-86400), month(DATE-86400), day = day(DATE-86400), hour = hour(DATE)), TRUE ~ DATE)
Надеюсь, что это решит вашу проблему.