【问题标题】:Converting non-standard date format strings ("April-20") to date objects R将非标准日期格式字符串(“April-20”)转换为日期对象 R
【发布时间】:2021-09-30 15:55:56
【问题描述】:

我有一个格式为 month_name-2_digit_year 的日期字符串向量,即

a = rbind("April-21", "March-21", "February-21", "January-21") 

我正在尝试将该向量转换为日期对象的向量。我知道这个问题与这个问题非常相似:几年前发布的Convert non-standard date format to date in R,但不幸的是,它没有回答我的问题。

我尝试了以下 as.Date() 调用来执行此操作,但它只返回一个 NA 向量。即

b = as.Date(a, format = "%B-%y")
b = as.Date(a, format = "%B%y")
b = as.Date(a, "%B-%y")
b = as.Date(a, "%B%y")

我也尝试使用 openxlsx 包中的 convertToDate 函数:

b = convertToDate(a, format = "%B-%y") 

我也尝试了上述所有方法,但使用的是单个字符串而不是向量,但这产生了同样的问题。

对于为什么这不起作用,我有点迷茫,因为这种格式在我的脚本的前面已经反向工作了(也就是说,我有一个日期对象已经是 dd-mm-yyyy 格式并将其转换为month_name-yy 使用 %B-%y)。当字符串是非标准日期格式(如果您在美国,则为 dd-mm-yyy 或 mm-dd-yy 以外的任何日期格式)时,是否有另一种方法可以从字符串到日期?

为了记录,我的 R 语言环境都是英国和英语。

提前致谢。

【问题讨论】:

    标签: r string date formatting


    【解决方案1】:

    日期必须包含日、月和年这三者。转换为仅需要月份和年份的 yearmon 类,然后转换为如下 (1) 和 (2) 中的 Date 或添加 (3) 中的日期。

    (1) 和 (3) 给出月初,(2) 给出月底。

    (3) 仅使用基础 R 中的函数。

    还可以考虑完全不转换为 Date 而只使用 yearmon 对象,因为它们直接代表输入所代表的年份和月份。

    library(zoo)
    
    # test input
    a <- c("April-21", "March-21", "February-21", "January-21") 
    
    # 1
    as.Date(as.yearmon(a, "%B-%y"))
    ## [1] "2021-04-01" "2021-03-01" "2021-02-01" "2021-01-01"
    
    # 2
    as.Date(as.yearmon(a, "%B-%y"), frac = 1)
    ## [1] "2021-04-30" "2021-03-31" "2021-02-28" "2021-01-31"
    
    # 3
    as.Date(paste(1, a), "%d %B-%y")
    ## [1] "2021-04-01" "2021-03-01" "2021-02-01" "2021-01-01"
    

    【讨论】:

    • 谢谢你的作品。然后我返回并使用 format(a, "%B-%y) 重新格式化日期以进入原始格式,但这很简单。
    • 如果你这样做,你会得到一个字符串。它将不再是问题所要求的 Date 对象。例如,如果它只是一个字符串,你不能给它加1来得到第二天。
    【解决方案2】:

    除了动物园,@G.格洛腾迪克提到,你也可以使用时钟或润滑。

    clock 支持称为year_month_day 的可变精度日历类型。在这种情况下,您需要 "month" 精度,然后您可以将日期设置为您想要的任何日期并转换回日期。

    library(clock)
    
    x <- c("April-21", "March-21", "February-21", "January-21") 
    
    ymd <- year_month_day_parse(x, format = "%B-%y", precision = "month")
    ymd
    #> <year_month_day<month>[4]>
    #> [1] "2021-04" "2021-03" "2021-02" "2021-01"
    
    # First of month
    as.Date(set_day(ymd, 1))
    #> [1] "2021-04-01" "2021-03-01" "2021-02-01" "2021-01-01"
    
    # End of month
    as.Date(set_day(ymd, "last"))
    #> [1] "2021-04-30" "2021-03-31" "2021-02-28" "2021-01-31"
    

    最简单的解决方案可能是使用lubridate::my(),它按“月后年”的顺序解析字符串。这假设您想要每月的第一天,这对您来说可能正确,也可能不正确。

    library(lubridate)
    
    x <- c("April-21", "March-21", "February-21", "January-21") 
    
    # Assumes first of month
    my(x)
    #> [1] "2021-04-01" "2021-03-01" "2021-02-01" "2021-01-01"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 2023-03-26
      • 2017-12-20
      • 1970-01-01
      • 2019-01-31
      • 2013-12-28
      相关资源
      最近更新 更多