检查R中的日期是否为空白?

时间:2015-04-01 13:54:20

标签: r date testing

一个简单的,但我相信有人知道如何做到这一点......

在R中,我在我的函数中寻找像 is.blank 这样的错误陷阱,其中用户可以指定日期或者它可以是空白,我们将默认使用今天的日期(即Sys.Date()

我试过

date.end <- ""

# then in function  
if (date.end == "" || is.null(date.end)) {
  message("end date not specified and so setting to today")
  date.end <- Sys.Date()
} else {
  # use the date.end passed in as Date class
}

但是这个检查吓坏了charToDate(),即

test.end == ""
Error in charToDate(x) : 
  character string is not in a standard unambiguous format

请告知如何检查基础R中的空白日期? (以及错误捕获日期的任何其他智慧......)

添加澄清:

  1. 大部分时间,该功能都会获得好日期,例如

    date.end <-  as.Date("31/03/2015", "%d/%m/%Y")
    

    所以我不想改变课程。

  2. 但是,如果用户没有指定日期,你如何处理你想要默认的奇怪情况?

5 个答案:

答案 0 :(得分:1)

使用NA表示缺少的日期,然后将这些NA替换为默认值:

date.end[is.na(date.end)] <- Sys.Date()

答案 1 :(得分:1)

请注意Sys.Date()返回Date类的对象。见class(Sys.Date())。因此,当您将==character进行比较时,Date比较没有意义。

解决问题的一种方法是将Date转换为character

date.end <- ""

# then in function  
if (date.end == "" || is.null(date.end)) {
  message("end date not specified and so setting to today")
  date.end = as.character(Sys.Date())
}
##end date not specified and so setting to today

date.end == ""
##[1] FALSE

print(date.end)
##[1] "2015-04-01"

请注意,date.end现在是character

请参阅in this post.

中的讨论

编辑:彻底检修。好的,从阅读你的后续评论和问题看来,你想要的东西如下(尽管还不是很清楚)。

我认为你让它变得更复杂。首先,让我们创建一个可以处理单个(i)Date的函数,(ii)可能格式错误的character,或者(iii){{1}对象。

NULL

现在,让我们创建一个在日期列表中应用dateHandler <- function(x) { if (is.null(x) || identical(x, "")) { out <- Sys.Date() } else { x <- as.character(x) out <- as.Date(x, format = "%Y-%m-%d") if (is.na(out)) { out <- Sys.Date() } } return(out) } # Let's test it in a number of examples: dateHandler("2014-02-21") dateHandler(NULL) dateHandler("21/03/1999") # Wrong format, returns today dateHandler("") dateHandler("2014-04-01") dateHandler(Sys.Date()) 的函数:

dateHandler

函数handleListOfDates <- function(list.of.dates) { return(do.call(c, lapply(list.of.dates, dateHandler))) } # Let's test that: test.data.list <- list("2014-05-01", NULL, "", Sys.Date(), "2015-02-02", "1999-12-31", "") #print(test.data.list) # See this handleListOfDates(test.data.list) # [1] "2014-05-01" "2015-04-01" "2015-04-01" "2015-04-01" "2015-02-02" "1999-12-31" "2015-04-01" 也会正确处理handleListOfDates而不是vector个日期。 希望这是你想要的。

答案 2 :(得分:0)

我试图使用人们的答案元素。喜欢@ tim-biegeleisen na想法作为指数。并从@aebilgrau和@csgillepsie打字。 NULL只会造成麻烦:

  • 绊倒管道操作员
  • is.null返回一个TRUE / FALSE,因此您无法将其用作索引,例如is.na
  • 使用is.null进行搜索以获得索引布尔值对单个值感到不满。

所以这会让人费解!

library(data.table)

date.end.ok <- as.Date("31/03/2015", "%d/%m/%Y")
date.end.null <- NULL
date.end.blank <- ""

date.end.list <- list(date.end.blank, date.end.null, date.end.ok)
date.end.dt <- data.table("date"= date.end.list )


testdate <- function(date.end) {

  # checks
  # sort out any nulls first, replace with NA to not trip up |
  # note null has length 0
  if (length(date.end) <= 1) {
    end.date.is.null <- is.null(date.end)
   } else {
    # sapply will not work on null or single value
    # work along list (I am expecting input to be data.table column)
    end.date.is.null <- sapply(date.end, is.null)
  }
  date.end[end.date.is.null] <- NA #replace with NA to not trip up |

  end.date.is.bad <- (as.character(date.end) == "" |  
                      end.date.is.null) #Thanks aebilgrau

  # any problems found? any(end.date.is.bad) 
  if (any(end.date.is.bad)) {
    message("end date not specified and so setting to today")
    date.end[end.date.is.bad] <- as.Date(Sys.Date(),
                                     "%d/%m/%Y") #Thanks tim-biegeleisen
  } else {
     # go with date.end given    
  }

  #happy
  return(date.end)
}

这种方法适用于列表和单个值。索引好的。 但不保留 As.Date类型!即返回

  • testdate(date.end.blank)“16526”
  • testdate(date.end.null)16526

我想我可能会在

中关注我的类型为NULL

我没有把它放在原来的答案中,因为看起来太详细了。

  

已排序:请参阅 @aebilgrau 修改 datehandler 回答并为其+1!

答案 3 :(得分:-1)

你设置&#34; end.date&#34; &lt; - &#34;&#34;然后你测试&#34; date.end&#34;但它失败了。注意&#34;结束&#34;和&#34;日期&#34;在分配和测试中被翻转。

否则,end.date == ""应该有效,或者您可以测试字符串nchar(end.date)中的字符数,在您的情况下为零。

答案 4 :(得分:-1)

您可以使用与此类似的内容:

dplyr::mutate(Result = case_when(is.na.POSIXlt(DATE_var) ~ "<Alternative date_var or sys.date()>", TRUE ~  DATE_FINALIZADO))