【问题标题】:How to split a date and time column into separate day, month, hour, minute, second, day of week columns in r?如何在r中将日期和时间列拆分为单独的日、月、小时、分钟、秒、星期几列?
【发布时间】:2020-10-18 05:46:55
【问题描述】:

我正在尝试将日期和时间列拆分为单独的日、月、小时、分钟、秒、星期几列。我正在使用 lubridate 和 mutuate 函数,但是当我尝试使用以下代码时,我收到此错误:警告消息:所有格式都无法解析。未找到格式。

我的新列已创建,但它们都包含 NA - 想知道是否有人可以提供帮助?

我的专栏是这样的:

tpep_pickup_datetime

01/07/2019 00:51:15
01/07/2019 00:46:30
01/07/2019 00:25:35

我的代码是这样的:

taxidata3 <- taxidata2 %>%
  mutate(tpep_pickup_datetime = mdy_hms(tpep_pickup_datetime), 
         day = day(tpep_pickup_datetime),
         month = month(tpep_pickup_datetime), 
         year = year(tpep_pickup_datetime),
         dayofweek = wday(tpep_pickup_datetime),
         hour = hour(tpep_pickup_datetime),
         minute = minute(tpep_pickup_datetime),
         second = second(tpep_pickup_datetime))

【问题讨论】:

  • mdy_hms 的输出是月/日/还是日/月
  • 嗨 akrun - 现在是天/月
  • 那么你的代码应该是dmy_hms

标签: r lubridate dplyr


【解决方案1】:

根据来自 OP 的 cmets,日期格式是日/月/...而不是月/日/...这里,我们需要 dmy_hms。所以,每个字母表示出现的顺序

library(lubridate)
library(dplyr)
taxidata3 <- taxidata2 %>%
  mutate(tpep_pickup_datetime = dmy_hms(tpep_pickup_datetime), 
         day = day(tpep_pickup_datetime),
         month = month(tpep_pickup_datetime), 
         year = year(tpep_pickup_datetime),
         dayofweek = wday(tpep_pickup_datetime),
         hour = hour(tpep_pickup_datetime),
         minute = minute(tpep_pickup_datetime),
         second = second(tpep_pickup_datetime))

【讨论】:

    【解决方案2】:

    这是使用正则表达式匹配日期组件的stringr 解决方案:

    数据:

    df <- data.frame(
      tpep_pickup_datetime = c("01/07/2019 00:51:15", "01/07/2019 00:46:30", "01/07/2019 00:25:35")
    )
    

    解决方案:

    library(stringr)
    df$day <- str_extract(df$tpep_pickup_datetime, "^\\d{2}") 
    df$month <- str_extract(df$tpep_pickup_datetime, "(?<=/)\\d{2}")
    df$year <- str_extract(df$tpep_pickup_datetime, "\\d{4}")
    df$hour <- str_extract(df$tpep_pickup_datetime, "(?<= )\\d{2}(?=:)")
    df$minute <- str_extract(df$tpep_pickup_datetime, "(?<=:)\\d{2}(?=:)")
    df$second <- str_extract(df$tpep_pickup_datetime, "(?<=:)\\d{2}$")
    

    结果:

    df
      tpep_pickup_datetime day month year hour minute second
    1  01/07/2019 00:51:15  01    07 2019   00     51     15
    2  01/07/2019 00:46:30  01    07 2019   00     46     30
    3  01/07/2019 00:25:35  01    07 2019   00     25     35
    

    【讨论】:

      【解决方案3】:

      这是使用separate 函数的另一种选择。代码和输出如下:-

      library(tidyverse)
      df <- data.frame(
          tpep_pickup_datetime = c("01/07/2019 00:51:15", "01/07/2019 00:46:30", 
                                   "01/07/2019 00:25:35"))
      
      df %>% 
          separate(tpep_pickup_datetime, c("Day", "Month", "Year_time"),
                   sep = "/", remove = FALSE) %>% 
          separate(Year_time, c("Year", "Time"),
                   sep = " ", remove = TRUE) %>% 
          separate(Time, c("Hour", "Minute", "Second"),
                   sep = ":", remove = TRUE) 
      
      # tpep_pickup_datetime Day Month Year Hour Minute Second
      #1  01/07/2019 00:51:15  01    07 2019   00     51     15
      #2  01/07/2019 00:46:30  01    07 2019   00     46     30
      #3  01/07/2019 00:25:35  01    07 2019   00     25     35
      

      【讨论】:

        猜你喜欢
        • 2017-10-18
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 2016-06-06
        • 2012-11-06
        相关资源
        最近更新 更多