Непредсказуемые результаты при использовании функции cut () в R для преобразования дат в 15-минутные интервалы - PullRequest
0 голосов
/ 07 января 2020

ОК, это сводит меня с ума.

У меня есть несколько наборов данных со значениями времени, которые необходимо свернуть за 15-минутные интервалы.

Я нашел здесь решение, которое прекрасно работает на один набор данных. Но на следующем, который я пытаюсь сделать, я получаю странные результаты. У меня есть столбец с символьными данными, представляющими даты:

                 BeginTime
-------------------------------
    1           1/3/19 1:50 PM
    2           1/3/19 1:30 PM
    3           1/3/19 4:56 PM
    4          1/4/19 11:23 AM
    5           1/6/19 7:45 PM
    6          1/7/19 10:15 PM
    7          1/8/19 12:02 PM
    8          1/9/19 10:43 PM

И я использую следующий код (именно то, что я использовал в другом наборе данных, за исключением имен)

df$by15 = cut(mdy_hm(df$BeginTime), breaks="15 min")

но я получаю:

                    BeginTime              by15
-------------------------------------------------------
    1           1/3/19 1:50 PM      2019-01-03 13:36:00
    2           1/3/19 1:30 PM      2019-01-03 13:21:00
    3           1/3/19 4:56 PM      2019-01-03 16:51:00
    4          1/4/19 11:23 AM      2019-01-04 11:21:00
    5           1/6/19 7:45 PM      2019-01-06 19:36:00
    6          1/7/19 10:15 PM      2019-01-07 22:06:00
    7          1/8/19 12:02 PM      2019-01-08 11:51:00
    8          1/9/19 10:43 PM      2019-01-09 22:36:00
    9         1/10/19 11:25 AM      2019-01-10 11:21:00

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

1 Ответ

0 голосов
/ 07 января 2020

Вы можете использовать функцию lubridate :: round_date (), которая свернет ваши данные даты и времени следующим образом:

library(lubridate) # To handle datetime data
library(dplyr) # For data manipulation

# Creating dataframe
df <-
  data.frame(
    BeginTime = c("1/3/19 1:50 PM", "1/3/19 1:30 PM", "1/3/19 4:56 PM",
                  "1/4/19 11:23 AM", "1/6/19 7:45 PM", "1/7/19 10:15 PM",
                  "1/8/19 12:02 PM", "1/9/19 10:43 PM")
  )

df %>%
  # First we parse the data in order to convert it from string format to datetime
  mutate(by15 = parse_date_time(BeginTime, '%d/%m/%y %I:%M %p'),
         # We roll up the data/round it to 15 minutes interval
         by15 = round_date(by15, "15 mins"))
# 
# BeginTime                by15
# 1/3/19 1:50 PM   2019-03-01 13:45:00
# 1/3/19 1:30 PM   2019-03-01 13:30:00
# 1/3/19 4:56 PM   2019-03-01 17:00:00
# 1/4/19 11:23 AM  2019-04-01 11:30:00
# 1/6/19 7:45 PM   2019-06-01 19:45:00
# 1/7/19 10:15 PM  2019-07-01 22:15:00
# 1/8/19 12:02 PM  2019-08-01 12:00:00
# 1/9/19 10:43 PM  2019-09-01 22:45:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...