#r #dataframe
Вопрос:
Мне нужно классифицировать столбец, в котором дата является полем даты и времени (меткой времени), как показано на рисунке ниже:
Для этого мне нужно создать новый столбец в моем фрейме данных для получения новых данных, где результатом будет столбец, классифицированный с интервалом 2 часа, как на изображении выше.
Результат:
Как я могу это сделать?
Ответ №1:
Вы можете использовать floor_date
/ ceiling_date
из lubridate
library(dplyr)
library(lubridate)
df <- data.frame(time = Sys.time() sample(100000, 10))
df %>%
mutate(interval = hour(floor_date(time, '2 hours')),
interval1 = paste(interval, interval 2, sep = '-'),
interval2 = sprintf('[%d, %d)', interval, interval 2, sep = '-'))
# time interval interval1 interval2
#1 2021-06-07 13:14:15 12 12-14 [12, 14)
#2 2021-06-07 14:57:42 14 14-16 [14, 16)
#3 2021-06-06 23:42:58 22 22-24 [22, 24)
#4 2021-06-07 07:11:57 6 6-8 [6, 8)
#5 2021-06-08 01:20:38 0 0-2 [0, 2)
#6 2021-06-07 17:51:25 16 16-18 [16, 18)
#7 2021-06-07 16:15:47 16 16-18 [16, 18)
#8 2021-06-07 11:29:56 10 10-12 [10, 12)
#9 2021-06-07 16:59:13 16 16-18 [16, 18)
#10 2021-06-07 11:47:07 10 10-12 [10, 12)
Комментарии:
1. Эй, @Ronak Shah, я пытаюсь понять код. Я вижу, что вы создаете образец для использования в df. В моем случае я должен использовать df[‘InvoiceDate’], верно?
2. Верно.
df
это имя фрейма данных и имя столбца для меня.time
Замените его в соответствии с вашими данными. Такtime
что будет заменено наInvoiceDate
для вас.3. Я создаю свой столбец datetime и использовал его для применения преобразования:
rt_final['IntervalH'] <- rt_final$InvoiceDate rt_final %>% mutate(interval = hour(floor_date(rt_final$IntervalH, '2 hours')), interval1 = paste(interval, interval 2, sep = '-'), interval2 = sprintf('[%d, %d]', interval, interval 2, sep='-')) rt_final['IntervalH']
Но происходит ошибка: ` » Предупреждающее сообщение: Проблема соmutate()
столбцомinterval2
. ℹinterval2 = sprintf("[%d, %d]", interval, interval 2, sep = "-")
. ℹ один аргумент, не используемый форматом ‘[%d, %d]’ «4. @EricGomes Вы используете немного другой код. Можете ли вы попробовать
rt_final <- rt_final %>% mutate(intervalH = hour(floor_date(InvoiceDate, '2 hours')), intervalH = sprintf('[%d, %d)', intervalH, intervalH 2))
5. Спасибо @Ronak Shah, ты мне очень помогаешь!