5

我有一个格式的日期dd-mm-yyyy HH:mm:ss 验证这个日期的最好和最简单的方法是什么?

我试过

d <- format.Date(date, format="%d-%m-%Y %H:%M:%S")

但是,当非法日期过去时,我怎样才能捕捉到错误呢?

4

5 回答 5

12

简单的方法:

d <- try(as.Date(date, format="%d-%m-%Y %H:%M:%S"))
if("try-error" %in% class(d) || is.na(d)) {
  print("That wasn't correct!")
}

解释: format.Date在内部使用as.Date来转换dateDate类的对象。但是,它不使用格式选项,因此as.Date使用默认格式,即%Y-%m-%d然后%Y/%m/%d.

formatfrom 选项format.Date仅用于输出,不用于解析。从as.Date手册页引用:

“as.Date”方法接受字符串、因子、逻辑“NA”以及类“”POSIXlt”和“POSIXct”的对象。(通过忽略指定时区时间表示中的午夜之后的时间,最后转换为天数,默认 UTC。)还有类“日期”(来自包“日期”)和“日期”的对象'(来自包'chron')。根据指定格式尽可能处理字符串:忽略任何尾随字符。

但是,当您直接as.Date使用格式规范调用时,除了适合您的格式之外,不允许其他任何内容。

另见?as.Date

于 2012-11-19T09:05:17.443 回答
1

你可能想看看gsubfn包装。这具有(gsubfn特别是)与其他正则表达式函数一样工作以将片段与字符串匹配的函数,但随后它调用用户提供的函数并将匹配的片段传递给该函数。因此,您将编写自己的函数来查看年、月和日,并确保它们在正确的范围内(日的范围可能取决于经过的月份和年份。

于 2012-11-19T20:00:33.170 回答
1

如果在日期时间条目中需要灵活性,这可能会有所帮助。

我有一个函数,我想允许仅日期条目或日期时间条目,然后设置一个标志 - 仅在函数内部使用。我叫这面旗子data_type。稍后将在更大的函数中使用该标志来选择单位以获取两个日期的差异difftime。(在大多数情况下,该功能仅使用日期就可以了,但在某些情况下,用户可能需要更短的时间范围。如果他们不需要,我不想用更短的时间范围给用户带来不便。)

我发布此内容有两个原因:1)帮助任何试图允许灵活使用日期参数的人;2)欢迎在方法出现问题时进行完整性检查,因为这将进入 R 包中的函数。

dat_time_check_fn <- function(dat_time) {
  if (!anyNA(as.Date(dat_time, format= "%Y-%m-%d %H:%M:%S"))) date_type <- 1
else if (!anyNA(as.Date(dat_time, format= "%Y-%m-%d"))) date_type <- 2
else stop("Error: dates must either be in format '1999-12-31' or '1999-12-31 23:59:59' ")
date_type
}

日期时间案例

date5 <- "1999-12-31 23:59:59"

date_type <- dat_time_check_fn(date5)
date_type
[1] 1

仅日期案例:

date6 <- "1999-12-31"

date_type <- dat_time_check_fn(date6)
date_type
[1] 2

请注意,如果函数中的上述顺序颠倒,较长的日期时间可能会无意中强制转换为较短的版本,并且两种类型都会导致 date_type = 1。

我较大的函数有多个日期,但我需要它们兼容。下面,我正在检查上面检查的两个日期,其中一个是类型 1,一个是类型 2。组合类型会给出仅包含日期的结果(类型 2):

date_type <- dat_time_check_fn(c(date5, date6))
date_type
[1] 2

这是一个不合规的版本:

date7 <- "1/31/2011"

date_type <- dat_time_check_fn(date7)

Error in dat_time_check_fn(date7) : 
  Error: dates must either be in format '1999-12-31' or '1999-12-31 23:59:59'
于 2019-10-21T18:44:32.400 回答
0

我相信您正在寻找的是tryCatch功能。以下是我编写的脚本的摘录,该脚本接受具有两个系列的任何 .csv 文件,这些系列具有共同的 x 轴。“数据”中的第一列是常见的 x 轴变量,第 2 列和第 3 列是 y 轴变量。我需要 tryCatch 语句来确保脚本会创建一个绘图,而不管 x 轴数据是时间序列还是其他类型的变量。

### READ DATA FROM A CSV FILE
data = read.csv("STLDvsNEM2.csv", header = TRUE)

#CONVERT FIRST ROW OF DATA (IN MY CASE, THE COLUMN INTENDED TO BE THE X AXIS)
#TO AN ACCEPTABLE DATE FORMAT
#IF FIRST ROW OF DATA IS NOT IN AN ACCEPTABLE DATE FORMAT
#USE THE VALUE WITHOUT ANY TRANSFORMATION
x <- tryCatch({
  as.Date(data[,1])},
  warning = function(w) {},
  error = function(e) {
    x <- data[,1]
  })
y1 <- data[,2]
y2 <- data[,3]
于 2016-02-04T01:40:31.707 回答
0

这里的许多解决方案都容易发生 SQL 注入。他们返回TRUEdate = "2020-08-11; DROP * FROM my_table"这是一个矢量化的基本 R 函数,适用于NA

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
于 2020-08-27T07:19:10.260 回答