Дата-Время/ день манипуляции в R


У меня есть регулярные 5-минутные интервальные наборы данных datetime (около 50). Функции POSIXt/ lubridate очень хорошо преобразуют мои данные и время в 24-часовой формат по мере необходимости. Но я хотел бы добавить еще одну колонку с определением моего дня, чтобы быть с 6 утра до 6 утра (что в настоящее время полночь до полуночи). Я пытаюсь сделать это, чтобы захватить активность после 12 утра как часть текущей даты, а не следующей.

В настоящее время я пытаюсь создать группу каждый 288-й ряд (есть 288 5-минутных интервалов в a день). Но это создает проблему, потому что мои наборы данных не обязательно начинаются в уникальное время.

Я не хочу создавать смещения, потому что это искажает значения, соответствующие времени.

Есть ли эффективные способы обойти эту проблему? Спасибо.

2 2

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 и т. д., В соответствии с вашей конкретной потребностью.

mutate(DATE = dmy_hms(DATE))
Теперь создайте столбец для определения точек данных, которые необходимо изменить различными способами. Как и ваши точки данных с 00: 00:00 до 05:59: 59 (hms) должны быть частью предыдущей даты.
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)

Надеюсь, что это решит вашу проблему.