【问题标题】:R: Check if a date is validR:检查日期是否有效
【发布时间】:2020-06-18 02:31:01
【问题描述】:

假设一个日期指定为三个整数:年、月、日

年份为 4 位整数(如 2020),月份范围为 1-12,日期范围为 1-31。

我正在寻找一个简单的函数(称为 checkdate),它可以检查日期是否有效,如果有效则返回 TRUE,如果无效则返回 FALSE。

例如,checkdate(2008, 2, 29) 将返回 TRUE,因为 2008 年是闰年。

另一方面,checkdate(2009, 2, 29) 将返回 FALSE,因为 2009 年不是闰年。

checkdate(2009, 6, 31) 将返回 FALSE,因为 6 月只有 30 天。

等等

更新

根据 Dirk 的回答,下面是我所要求的功能:

    checkdate = function(y, m, d) {
        #y: A year, not abbreviated to 2 digits.
        #m: An integer in the range 1-12.
        #d: An integer in the range 1-31.

        #Convert to an R Date object.
        #If the date is not valid, NA is returned.
        dt = as.Date(paste(y, m, d, sep='-'), optional=TRUE)

        ifelse(is.na(dt), FALSE, TRUE)
    }

【问题讨论】:

    标签: r date


    【解决方案1】:

    如果输入失败返回FALSE,尝试将输入转换为日期。

    checkdate <- function(y, m, d) {
        tryCatch(lubridate::is.Date(as.Date(paste(y, m, d, sep = '-'))), 
                 error = function(e) return(FALSE))
    }
    
    checkdate(2009, 6, 31)
    #[1] FALSE
    checkdate(2009, 2, 29)
    #[1] FALSE
    checkdate(2008, 2, 29)
    #[1] TRUE
    

    【讨论】:

    • 我找不到 is.Date 的任何文档。这也许是你自己的个人职能吗?还是来自需要安装的库?
    【解决方案2】:

    当然。尝试解析它:

    R> days <- 28:31
    R> dates <- paste0("2020-02-", days)
    R> as.Date(dates)
    [1] "2020-02-28" "2020-02-29" NA           NA          
    R> 
    

    这表明 2020 年存在 2 月 28 日和 29 日(闰年),但不存在 30 日和 31 日。

    从您的三个向量中,您可以使用 sprintf("%4d-%02d-%02", y, m, d) 创建一个文本输入向量以进行解析。

    【讨论】:

    • 如果我在 as.Date 调用中使用参数 optional=TRUE,您的解决方案将有效。否则会产生错误。
    • Ronak 和 Dirk 的两种解决方案都很不错。我正在检查 Dirk 的答案,因为它不需要使用第三方软件包——只需使用基础 R。
    • 您运行什么版本的 R?我已经使用基本功能as.Date() 了数十亿年,并且从不需要保护/免受 NA 的影响。我无法重现您在这里所说的内容。我的示例来自标准的“实时”会话(在 R 4.0.1 中)。
    【解决方案3】:

    使用@Ronak Shah 的逻辑基础 R:

    checkdate <- function(y, m, d) {
      tryCatch(inherits(as.Date(paste(y, m, d, sep = '-')), "Date"), 
               error = function(e) return(FALSE))
    }
    checkdate(2015, 12, 31)
    

    【讨论】:

      猜你喜欢
      • 2017-02-28
      • 2012-03-15
      • 2013-01-09
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      相关资源
      最近更新 更多