使用 separate() 时保持 date_time 格式

Keeping date_time format when using separate()

我有这个问题:

# A tibble: 541,909 x 7

   InvoiceNo StockCode Quantity         InvoiceDate UnitPrice CustomerID
       <chr>     <chr>    <int>              <dttm>     <dbl>      <int>
 1    536365    85123A        6 2010-01-12 08:26:00      2.55      17850
 2    536365     71053        6 2010-01-12 08:26:00      3.39      17850
 3    536365    84406B        8 2010-01-12 08:26:00      2.75      17850
 4    536365    84029G        6 2010-01-12 08:26:00      3.39      17850
 5    536365    84029E        6 2010-01-12 08:26:00      3.39      17850
 6    536365     22752        2 2010-01-12 08:26:00      7.65      17850
 7    536365     21730        6 2010-01-12 08:26:00      4.25      17850
 8    536366     22633        6 2010-01-12 08:28:00      1.85      17850
 9    536366     22632        6 2010-01-12 08:28:00      1.85      17850
10    536367     84879       32 2010-01-12 08:34:00      1.69      13047

旨在使用 separate()tidyr 拆分 InvoiceDate 列。

retail %>% 
  separate(InvoiceDate, c("date", "time") , sep = " ", convert = FALSE)

我想知道有什么方法可以为新的日期和时间列保留 dttm 格式?

# A tibble: 541,909 x 8
   InvoiceNo StockCode Quantity       date     time UnitPrice CustomerID
 *     <chr>     <chr>    <int>      <chr>    <chr>     <dbl>      <int>
 1    536365    85123A        6 2010-01-12 08:26:00      2.55      17850
 2    536365     71053        6 2010-01-12 08:26:00      3.39      17850
 3    536365    84406B        8 2010-01-12 08:26:00      2.75      17850
 4    536365    84029G        6 2010-01-12 08:26:00      3.39      17850
 5    536365    84029E        6 2010-01-12 08:26:00      3.39      17850
 6    536365     22752        2 2010-01-12 08:26:00      7.65      17850
 7    536365     21730        6 2010-01-12 08:26:00      4.25      17850
 8    536366     22633        6 2010-01-12 08:28:00      1.85      17850
 9    536366     22632        6 2010-01-12 08:28:00      1.85      17850
10    536367     84879       32 2010-01-12 08:34:00      1.69      13047

我假设您希望将列保留为可以识别为日期或时间的内容,以便您可以根据它们进行进一步的计算。因此,我建议跳过 separate 并使用 mutate 以及 "chron" 或 "lubridate" 中的函数来处理 "time" 列。

这里有一些例子:

library(chron)
mydf %>%
  mutate(Date = as.Date(DateTime), 
         Time = times(format(DateTime, "%H:%M:%S"))) %>%
  select(-DateTime)
# # A tibble: 5 x 3
#      ID       Date        Time
#   <int>     <date> <S3: times>
# 1     1 2017-12-25    20:41:21
# 2     2 2017-12-25    20:41:22
# 3     3 2017-12-25    20:41:23
# 4     4 2017-12-25    20:41:24
# 5     5 2017-12-25    20:41:25

library(lubridate)
mydf %>%
  mutate(Date = as.Date(DateTime), 
         Time = hms(format(DateTime, "%H:%M:%S"))) %>%
  select(-DateTime)
# # A tibble: 5 x 3
#      ID       Date         Time
#   <int>     <date> <S4: Period>
# 1     1 2017-12-25  20H 41M 21S
# 2     2 2017-12-25  20H 41M 22S
# 3     3 2017-12-25  20H 41M 23S
# 4     4 2017-12-25  20H 41M 24S
# 5     5 2017-12-25  20H 41M 25S

这里有一些示例数据可以使用:

mydf <- structure(list(ID = 1:5, DateTime = structure(c(1514214681.99041, 
    1514214682.99041, 1514214683.99041, 1514214684.99041, 1514214685.99041), 
    class = c("POSIXct", "POSIXt"))), .Names = c("ID", "DateTime"), 
    row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"))

mydf
## # A tibble: 5 x 2
##      ID            DateTime
##   <int>              <dttm>
## 1     1 2017-12-25 20:41:21
## 2     2 2017-12-25 20:41:22
## 3     3 2017-12-25 20:41:23
## 4     4 2017-12-25 20:41:24
## 5     5 2017-12-25 20:41:25