【问题标题】:How to check that date exist without broken data pipeline in R?如何在 R 中没有损坏数据管道的情况下检查该日期是否存在?
【发布时间】:2020-10-31 20:02:46
【问题描述】:

我在 R 中有一个数据管道,并且遇到了将字符串转换为将来不存在日期的日期的错误

s_date <- "2021-02-29"    
as.Date(s_date, origin = "1970-01-01")

此代码生成错误“charToDate(x) 中的错误:字符串不是标准的明确格式”

这是来自管道的更详细的代码:

# Fixed month and day
date_month <- "2"
date_day <- "29"

# Loop by years
for(date_year in c("2020", "2021")) {

   s_date <- paste0(date_year, "-", date_month, "-", date_day)

   # BUG
   date_selected <- as.Date(s_date, origin = "1970-01-01")

}

如何在不中断管道的情况下处理此错误。例如,通过添加下一个有效日期“2021-03-01”。

谢谢!

【问题讨论】:

  • 您能否添加更多您可以接收的输入示例以及您期望的相应输出?
  • 这里最简单的解决方法是更正上游源中的源日期数据。
  • 我添加了更详细的示例
  • 可能是涉及tryCatch的循环。

标签: r date


【解决方案1】:

此解决方案使用包lubridate。代码首先检查for循环中的日期是否有效,如果无效则调用辅助函数nextDate

nextDate <- function(y, m, d){
  y <- as.integer(y)
  m <- as.integer(m)
  d <- as.integer(d)
  days <- lubridate::days_in_month(paste(y, m, 1, sep = "-"))
  as.Date(paste(y, m, min(days, d), sep = "-")) + 1L
}

date_month <- "2"
date_day <- "29"

# Loop by years
for(date_year in c("2020", "2021")) {
  s_date <- paste0(date_year, "-", date_month, "-", date_day)
  # 
  repeat{
    date_selected <- tryCatch(as.Date(s_date, origin = "1970-01-01"),
                              error = function(e) e
    )
    if(inherits(date_selected, "error")){
      s_date <- nextDate(date_year, date_month, date_day)
    }else break
  }
}

查看结果。

s_date
#[1] "2021-03-01"

【讨论】:

    【解决方案2】:

    您可能想尝试ISOdate,它会产生NA 而不是错误。

    as.Date(do.call(ISOdate, as.list(el(strsplit("2020-02-29" , "-")))))
    # [1] "2020-02-29"
    as.Date(do.call(ISOdate, as.list(el(strsplit("2021-02-29" , "-")))))
    # [1] NA
    

    您的循环可能如下所示:

    date_month <- "2"
    date_day <- "29"
    date_year <- c("2020", "2021")
    r <- `class<-`(integer(), "Date")
    
    for (i in seq(date_year)) {
      d <- as.Date(ISOdate(date_year[i], date_month, date_day))
      d <- if (is.na(d)) {
        as.Date(ISOdate(date_year[i], as.numeric(date_month) + 1, 1))
      } else d
      r[i] <- d
    }
    r
    # [1] "2020-02-29" "2021-03-01"
    

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 2019-04-06
      • 2014-12-11
      • 2012-01-13
      • 2014-12-09
      • 1970-01-01
      相关资源
      最近更新 更多