R - 日期格式检查

6
我将尝试检查给定日期是否为dd/mm/yyyy格式,在R语言中,同时也要检查它是否是有效的日期。我希望输出结果以TRUE或FALSE格式显示,例如:
输入:
date<- c('12/05/2016','35/11/2067','12/52/1000')

输出:

TRUE FALSE FALSE

5
转换成日期后是否为NA:!is.na(as.Date(date, format="%d/%m/%Y")) - talat
3个回答

11
你可以使用这个函数:

You can use this function:

IsDate <- function(mydate, date.format = "%d/%m/%y") {
  tryCatch(!is.na(as.Date(mydate, date.format)),  
           error = function(err) {FALSE})  
}

IsDate(date)
[1]  TRUE FALSE FALSE

代码的原始来源在这里

.


你能举个 tryCatch 起作用的例子吗? - talat
1
日期<-NULL !is.na(as.Date(日期, date.format)) as.Date.default(日期, date.format)的错误: 无法将“日期”转换为“日期”类别 IsDate(日期) [1] FALSE - Terru_theTerror
这段代码容易受到 SQL 注入攻击:IsDate("2020-08-05; SELECT * FROM db", "%Y-%M-%d") 的返回值为 TRUE。 - Jonas Lindeløv

2

您还可以使用lubridate包:

library(lubridate)
!is.na(parse_date_time(c('12/05/2016','35/11/2067','12/52/1000'),orders="dmy"))

1

这是一个基于向量化的 R 基础函数,可以处理 NA,并且能够防止 SQL 注入:

is_date = function(x, format = NULL) {
  formatted = try(as.Date(x, format), silent = TRUE)
  is_date = as.character(formatted) == x & !is.na(formatted)  # valid and identical to input
  is_date[is.na(x)] = NA  # Insert NA for NA in x
  return(is_date)
}

让我们试试:

> is_date(c("2020-08-11", "2020-13-32", "2020-08-11; DROP * FROM table", NA), format = "%Y-%m-%d")
## TRUE FALSE FALSE    NA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接