尝试合并日期和时间

时间:2019-04-25 22:58:55

标签: r dplyr tidyverse lubridate stringr

我正在尝试合并日期和时间。这些是在导入文件时从文件中发出的,看起来像这样:

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

做到这一点的最佳方法是什么?我已经尝试过这个(based on this other answer),但这种情况在我的情况下并不起作用。

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 个答案:

答案 0 :(得分:2)

如果您想从start_time获取booking_date的日期,则基本R方法是从pastebooking_date的“日期”部分,从{ {1}}并将其转换为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

答案 1 :(得分:2)

我们也可以使用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