【问题标题】:How to split date and time into two columns如何将日期和时间分成两列
【发布时间】:2019-09-23 07:54:00
【问题描述】:

我需要拆分10/4/2018 19:21 并尝试过

AccidentsMp$Hours <- format(as.POSIXct(AccidentsMp$Job.Date, "%Y-%m-%d %H:%M:%S", tz = ""), format = "%H:%M")

AccidentsMp$Dates <- format(as.Date(AccidentsMp$Job.Date,"%Y-%m-%d"), format = "%d/%m/%Y")

我怎样才能把上面的日期和时间分成两列?数据现在是factor类。

【问题讨论】:

标签: r date time


【解决方案1】:

如果您的数据遵循与所示相同的格式,我们可以仅使用基本 R 进行如下操作

df$datetime <- as.POSIXct(df$Job.Date, format = "%d/%m/%Y %H:%M")
transform(df, time = format(datetime, "%T"), date = format(datetime, "%d/%m/%Y"))

#        Job.Date            datetime     time       date
#1 10/4/2018 19:21 2018-04-10 19:21:00 19:21:00 10/04/2018
#2 10/4/2018 19:22 2018-04-10 19:22:00 19:22:00 10/04/2018
#3 10/4/2018 19:23 2018-04-10 19:23:00 19:23:00 10/04/2018

如果不需要,您可以稍后删除 datetime 列。

数据

df <- data.frame(Job.Date = c("10/4/2018 19:21", "10/4/2018 19:22",
                              "10/4/2018 19:23"))

【讨论】:

    【解决方案2】:

    如果一个人需要以艰难的方式去做:

    text<-"10/4/2018 19:21"
    res<-strsplit(text," ")
    df$Date<-res[[1]][1]
    df$Time<-res[[1]][2]
    #install.packages("lubridate")
    df$Date<-lubridate::mdy(df$Date)
    df$Time<-lubridate::hm(df$Time)
    

    您可以在不使用任何包的情况下获取时间和日期:

    df$Time<-format(strptime(res[[1]][2],"%H:%M",tz=""),"%H:%M") #cleaner output
    df$Date<- as.Date(res[[1]][1],"%m/%d/%Y")
    

    使用lubridate的结果

     month item sales       Date       Time
    1     1    A    10 2018-10-04 19H 21M 0S
    2     2    b    20 2018-10-04 19H 21M 0S
    3     2    c     5 2018-10-04 19H 21M 0S
    4     3    a     3 2018-10-04 19H 21M 0S
    

    数据

    df<-structure(list(month = c(1, 2, 2, 3), item = structure(c(2L, 
    3L, 4L, 1L), .Label = c("a", "A", "b", "c"), class = "factor"), 
        Time = new("Period", .Data = c(0, 0, 0, 0), year = c(0, 0, 
        0, 0), month = c(0, 0, 0, 0), day = c(0, 0, 0, 0), hour = c(19, 
        19, 19, 19), minute = c(21, 21, 21, 21))), class = "data.frame", row.names = c(NA, 
    -4L))
    

    【讨论】:

      【解决方案3】:

      这是tidyverse的选项

      library(tidyverse)
      library(lubridate)
      df %>% 
        mutate(Job.Date = dmy_hm(Job.Date)) %>% 
        separate(Job.Date, into = c('date', 'time'), sep=' ', remove = FALSE)
      #           Job.Date       date     time
      #1 2018-04-10 19:21:00 2018-04-10 19:21:00
      #2 2018-04-10 19:22:00 2018-04-10 19:22:00
      #3 2018-04-10 19:23:00 2018-04-10 19:23:00
      

      或使用base R

      read.table(text = as.character(df$Job.Date), header = FALSE,
           col.names = c("date", "time"))
      

      数据

      df <- structure(list(Job.Date = structure(1:3, .Label = c("10/4/2018 19:21", 
      "10/4/2018 19:22", "10/4/2018 19:23"), class = "factor")), 
       class = "data.frame", row.names = c(NA, -3L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-16
        • 2018-09-14
        • 2021-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 1970-01-01
        相关资源
        最近更新 更多