【问题标题】:Convert Date in R from dash to slash format?将R中的日期从破折号转换为斜线格式?
【发布时间】:2020-09-01 10:18:25
【问题描述】:

我有以下日期:

my_dataset <- tibble(my_date = c("03-05-2020", "04-05-2020", "05-05-2020", "06-05-2020"))

我想创建一个名为nice_dates 的新列,其日期格式为:dd/mm/yyyy 格式,所以我最终会得到这样的结果:

my_date    | nice_dates 
03-05-2020 | 03/05/2020
04-05-2020 | 04/05/2020
05-05-2020 | 05/05/2020
06-05-2020 | 06/05/2020

我曾尝试使用 lubridate pacakge,但在定义新格式时卡住了,我知道它应该是“%d/%m/%Y”,但是使用 as.Date() 会产生 NA。

我应该改用 gsub 吗?

【问题讨论】:

    标签: r date lubridate


    【解决方案1】:

    @ThoVu 快到了。所以为了完整性,一个更简单的答案,只有基础 R。

    代码
    ## input data as before
    df <- data.frame(my_date = c("03-05-2020", "04-05-2020", 
                                 "05-05-2020", "06-05-2020"))
    
    ## create Date objects using base R
    df$parsed <- strptime(df$my_date, "%d-%m-%Y")
    
    ## format them to spec
    df$nice_dates <- format(df$parsed, "%d/%m/%Y")
    
    输出
    R> df <- data.frame(my_date = c("03-05-2020", "04-05-2020",
                                    "05-05-2020", "06-05-2020"))
    R> df$parsed <- strptime(df$my_date, "%d-%m-%Y")
    R> df$nice_dates <- format(df$parsed, "%d/%m/%Y")
    R> df
         my_date     parsed nice_dates
    1 03-05-2020 2020-05-03 03/05/2020
    2 04-05-2020 2020-05-04 04/05/2020
    3 05-05-2020 2020-05-05 05/05/2020
    4 06-05-2020 2020-05-06 06/05/2020
    R> 
    

    我的一般建议是永远不要在可以使用适当的日期解析器时对日期输入使用字符串操作或正则表达式。

    【讨论】:

      【解决方案2】:

      您需要先将日期转换为日期类,然后使用format 获取所需格式的数据。由于您想要的最终输出是字符,因此您也可以在此处使用gsub

      library(dplyr)
      
      my_dataset %>%
        mutate(nice_dates = format(as.Date(my_date, '%d-%m-%Y'), '%d/%m/%Y'), 
               nice_dates_gsub = gsub('-', '/', my_date))
      
      # A tibble: 4 x 3
      #  my_date    nice_dates nice_dates_gsub
      #  <chr>      <chr>      <chr>          
      #1 03-05-2020 03/05/2020 03/05/2020     
      #2 04-05-2020 04/05/2020 04/05/2020     
      #3 05-05-2020 05/05/2020 05/05/2020     
      #4 06-05-2020 06/05/2020 06/05/2020     
      

      您也可以使用lubridate::dmy(my_date) 将数据转换为日期类。

      【讨论】:

      • 这仍然使它成为字符类 - 我不能将它作为日期类型格式吗? - dmy 强制它是破折号而不是斜线?
      • 在 R 中,日期和时间仅以标准格式表示。如果您更改日期的格式,它们就会变成字符。
      【解决方案3】:

      在这里您可以使用anytime 包转换为日期格式,然后将 - 替换为斜杠 /

      library(dplyr)
      library(stringr)
      library(anytime)
      my_dataset <- tibble(my_date = c("03-05-2020", "04-05-2020", "05-05-2020", "06-05-2020"))
      my_dataset$mice_date <- format(anydate(my_dataset$my_date), '%m/%d/%Y')
      #   my_date    mice_date 
      #   <chr>      <chr>     
      # 1 03-05-2020 03/05/2020
      # 2 04-05-2020 04/05/2020
      # 3 05-05-2020 05/05/2020
      # 4 06-05-2020 06/05/2020
      

      【讨论】:

      • 还是很奇怪:为什么只使用 '%d-%m-%Y' 来调用 str_replace_all首先使用您想要的格式%d/%m/%Y
      • @DirkEddelbuettel 非常感谢您的反馈。你赢得了我的尊重。
      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 2016-10-05
      • 2011-08-08
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-19
      相关资源
      最近更新 更多