Пытаясь объединить даты и время - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь объединить даты и время.Они из файла при импорте выглядят так:

library(tidyverse)
library(lubridate)

bookings <- structure(list(booking_date = structure(c(1549670400, 1550275200, 
    1550880000, 1551484800, 1552089600, 1552694400), class = c("POSIXct", 
    "POSIXt"), tzone = "UTC"), start_time = structure(c(-2209043700, 
    -2209043700, -2209043700, -2209043700, -2209043700, -2209043700
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC")), row.names = c(NA, 
    -6L), class = c("tbl_df", "tbl", "data.frame"))

Что выглядит примерно так:

# A tibble: 6 x 2
  booking_date        start_time         
  <dttm>              <dttm>             
1 2019-02-09 00:00:00 1899-12-31 08:45:00
2 2019-02-16 00:00:00 1899-12-31 08:45:00
3 2019-02-23 00:00:00 1899-12-31 08:45:00
4 2019-03-02 00:00:00 1899-12-31 08:45:00
5 2019-03-09 00:00:00 1899-12-31 08:45:00
6 2019-03-16 00:00:00 1899-12-31 08:45:00

Очевидно, что дата в столбце start_time неверна.Его следует объединить с датой бронирования, чтобы в первой строке было написано 2019-02-09 08:45:00.

Каким будет наилучший способ сделать это?Я пробовал это ( на основе этого другого ответа ), что на самом деле не работает в моей ситуации.

bookings %>% 
  select(booking_date, start_time) %>% 
  mutate(time_2 = as.character(start_time)) %>% 
  mutate(time_3 = str_sub(time_2, -8, -1)) %>% 
  mutate(booking_start = dmy(paste(booking_date, time_3)))

Спасибо.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Мы также можем сделать это с lubridate::date.

date() <- позволяет установить компонент даты объекта даты / времени:

# Set the date component of start_time to be the date component of booking_date
date(bookings$start_time) <- bookings$booking_date

bookings

# A tibble: 6 x 2
  booking_date        start_time         
  <dttm>              <dttm>             
1 2019-02-09 00:00:00 2019-02-09 08:45:00
2 2019-02-16 00:00:00 2019-02-16 08:45:00
3 2019-02-23 00:00:00 2019-02-23 08:45:00
4 2019-03-02 00:00:00 2019-03-02 08:45:00
5 2019-03-09 00:00:00 2019-03-09 08:45:00
6 2019-03-16 00:00:00 2019-03-16 08:45:00

Поскольку он использует присваивание (<-), вы не можете использовать этот первый метод как часть конвейера. Что работает в конвейере, так это метод update.POSIXt (см. ?DateTimeUpdate), который позволяет обновлять компоненты даты даты, хотя вы должны указать каждую часть компонентов отдельно:

library(lubridate)

bookings %>%
    mutate(date_time = update(start_time,
                              year = year(booking_date),
                              month = month(booking_date),
                              day  = day(booking_date)))

  booking_date        start_time          date_time          
  <dttm>              <dttm>              <dttm>             
1 2019-02-09 00:00:00 1899-12-31 08:45:00 2019-02-09 08:45:00
2 2019-02-16 00:00:00 1899-12-31 08:45:00 2019-02-16 08:45:00
3 2019-02-23 00:00:00 1899-12-31 08:45:00 2019-02-23 08:45:00
4 2019-03-02 00:00:00 1899-12-31 08:45:00 2019-03-02 08:45:00
5 2019-03-09 00:00:00 1899-12-31 08:45:00 2019-03-09 08:45:00
6 2019-03-16 00:00:00 1899-12-31 08:45:00 2019-03-16 08:45:00
2 голосов
/ 26 апреля 2019

Если вы хотите получить дату для start_time из booking_date, базовый подход R будет заключаться в paste части «Дата» из booking_date и части «время» из start_time и преобразовать их в POSIXct.

bookings$start_time <- as.POSIXct(paste(as.Date(bookings$booking_date), 
                                  format(bookings$start_time, "%T")))

bookings
# A tibble: 6 x 2
#  booking_date        start_time         
#  <dttm>              <dttm>             
#1 2019-02-09 00:00:00 2019-02-09 08:45:00
#2 2019-02-16 00:00:00 2019-02-16 08:45:00
#3 2019-02-23 00:00:00 2019-02-23 08:45:00
#4 2019-03-02 00:00:00 2019-03-02 08:45:00
#5 2019-03-09 00:00:00 2019-03-09 08:45:00
#6 2019-03-16 00:00:00 2019-03-16 08:45:00

Если вы хотите использовать его в трубах, вы можете сделать

library(dplyr)
bookings %>%
  mutate(start_time = as.POSIXct(paste(as.Date(booking_date), 
                      format(start_time, "%T"))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...