【问题标题】:How to convert a date column with different character formats in R如何在R中转换具有不同字符格式的日期列
【发布时间】:2020-11-03 04:45:00
【问题描述】:

在 R 版本 3.6.0 中,我想将字符列标准化为日期格式。该列具有三种不同形式的日期,如下所示:

time <- c("12/31/2019", "2020-01-01 00:00:10.555", "1517075645.917")
t <- data.frame(time)

我可以看到“1517075645.917”是一个 unix 时间戳:

as.POSIXct(1517075645.917, origin = "1970-01-01", tz = "UTC")
# [1] "2018-01-27 17:54:05 UTC"

我可以将第一个和第二个元素标准化如下:

# version 1.5.6
library(lubridate)

parse_date_time(c("12/31/2019", "2020-01-01 00:00:10.555"), c("mdy", "ymd HMS"))
# [1] "2019-12-31 00:00:00 UTC" "2020-01-01 00:00:10 UTC

如何标准化包括字符“1517075645.917”在内的整个列,因为我找不到像“mdy”或“ymd HMS”这样的解析格式?

【问题讨论】:

    标签: r datetime lubridate


    【解决方案1】:

    这行得通吗:

    library(anytime)
    library(stringr)
    library(dplyr)
    t %>% 
       mutate(time1 = case_when(str_detect(time, '\\d{10}\\.\\d{3}') ~  time, TRUE ~ NA_character_  )) %>% 
       mutate(time1 = as.POSIXct(as.numeric(time1), origin = '1970-01-01', tz = 'UTC')) %>% 
       mutate(time = anytime(time)) %>% mutate(time = coalesce(time, time1)) %>% select(-time1)
                     time
    1 2019-12-31 00:00:00
    2 2020-01-01 00:00:10
    3 2018-01-27 23:24:05
    > 
    

    【讨论】:

      【解决方案2】:

      您可以使用if_else 并根据数据中的模式应用函数。

      library(dplyr)
      library(lubridate)
      
      t %>%
        mutate(time1 = suppressWarnings(if_else(grepl('^\\d+\\.\\d+$', time), 
                    as.POSIXct(as.numeric(time), origin = "1970-01-01", tz = "UTC"), 
                    parse_date_time(time, c("mdy", "ymd HMS")))))
      
      #                     time               time1
      #1              12/31/2019 2019-12-31 00:00:00
      #2 2020-01-01 00:00:10.555 2020-01-01 00:00:10
      #3          1517075645.917 2018-01-27 17:54:05
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 2023-01-16
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多