【问题标题】:How to convert a vector of strings in multiple formats into dates in R如何将多种格式的字符串向量转换为R中的日期
【发布时间】:2022-01-14 01:26:26
【问题描述】:

我有一个存储为字符串的日期向量,其中一些是 YYYY-mm-dd 格式,有些是 YYYY-dd-mm 格式。我需要弄清楚如何将这些转换为日期。幸运的是,YYYY-dd-mm 格式的所有实例都在任何一个月的 12 天之后,因此很容易辨别。

试过

dates <- c("2017-12-31","2017-12-30","2017-29-12","2017-28-12")
dates <- as.Date(dates, format = c("%Y-%m-%d","%Y-%d-%m"))

正在返回以下内容:

[1] "2017-12-31" "2017-12-30" NA           NA   

【问题讨论】:

  • 哎呀!谢谢你。已更新问题。仍在努力让两种日期格式都得到认可

标签: r date


【解决方案1】:

使用lubridate 中的parse_date_time 并传递您的日期可以采用的多种格式。

dates <- c("2017-12-31","2017-12-30","2017-29-12","2017-28-12")

as.Date(lubridate::parse_date_time(dates, c('ymd', 'ydm')))
#[1] "2017-12-31" "2017-12-30" "2017-12-29" "2017-12-28"

这与其他答案一样,首先优先考虑ymd,如果它无法识别日期,则检查ydm 格式。

【讨论】:

    【解决方案2】:

    如果您希望 YMD 成为默认值,而 YDM 是任何不起作用的东西,请先使用 YMD,然后返回并重试任何产生缺失值的结果:

    result = as.Date(dates, format = "%Y-%m-%d")  
    result[is.na(result)] = as.Date(dates[is.na(result)], format = "%Y-%d-%m")
    result
    # [1] "2017-12-31" "2017-12-30" "2017-12-29" "2017-12-28"
    

    这确实让我感到紧张,您假设月份和日期均小于 13 的任何日期都是 YMD...如果没有充分的理由,我不会做出这样的假设。

    【讨论】:

      【解决方案3】:

      这是一个稍长的方法。

      # sample date
      dates <- c("2015-02-23","2015-02-12","2015-18-02","2015-25-02")
      
      # libraries
      library(testit) #for has_warning
      library(lubridate) #for date functions
      

      此函数将更正日期。

      correct_dates = function(dates)
      {
        dates_new = character()
        for(i in 1:length(dates))
        {
          #print(i)
          if(has_warning(day(ydm(dates[i]))>12))
            {dates_new = append(dates_new, ymd(dates[i]))}
          else
            {dates_new = append(dates_new, ydm(dates[i]))}
        }
        return(dates_new)
      }
      

      检查结果

      > dates
      [1] "2015-02-23" "2015-02-12" "2015-18-02" "2015-25-02"
      > correct_dates(dates)
      [1] "2015-02-23" "2015-12-02" "2015-02-18" "2015-02-25"
      

      【讨论】:

        【解决方案4】:

        使用as.Date 的基本 R 选项

        > apply(list2DF(lapply(c("%Y-%m-%d", "%Y-%d-%m"), as.Date, x = dates)), 1, na.omit)
        [1] "2017-12-31" "2017-12-30" "2017-12-29" "2017-12-28"
        

        【讨论】:

          【解决方案5】:

          使用来自parsedateparse_date

          library(parsedate)
          as.Date(parse_date(dates))
          #[1] "2017-12-31" "2017-12-30" "2017-12-29" "2017-12-28"
          

          【讨论】:

            猜你喜欢
            • 2023-03-15
            • 2023-03-26
            • 2021-11-11
            • 1970-01-01
            • 2015-10-02
            • 2021-07-27
            • 1970-01-01
            • 2012-02-19
            • 1970-01-01
            相关资源
            最近更新 更多