在R

时间:2015-12-16 19:01:37

标签: regex r date

我正在尝试将字符转换为日期。日期具有异构格式,我宁愿不必单独编码每种日期格式(并指定哪些格式属于哪些元素,例如grepl)。

这是我的测试数据

test <- c(
  "2012-11-11", "12-5-23", "12/5/86", "2015-12-16 1300", 
  "8/6/92 3:00", "11/6/14 4", "10/31/14 52", 
  "06/15/2014 14:37", "2/10/06", "95-06-26", "82-10-03"
)

期望的结果

as.POSIXct(c("2012-11-11 00:00:00 UTC", "2012-05-23 00:00:00 UTC", "1986-12-05 00:00:00 UTC", "2015-12-16 13:00:00 UTC", "1992-08-06 03:00:00 UTC", "2011-06-14 04:00:00 UTC", "2014-10-31 00:52:00 UTC", "2014-06-15 14:37:00 UTC", "2006-02-10 00:00:00 UTC", "1995-06-26 00:00:00 UTC", "1982-10-03 00:00:00 UTC"), tz="UTC")

我意识到test中的一些奇怪的时间(如4或53)可能无法明确地解析,但对于那些我主要想确保随机时间不会搞砸日期的人

这是最佳尝试

orders <- paste(rep(c("ymd", "mdy", "Ymd"),each=3), c("HM","H","M"))
lubridate::parse_date_time(test, orders=orders, truncated=2)

[1] "2012-11-11 00:00:00 UTC" "0012-05-23 00:00:00 UTC" "1986-12-05 00:00:00 UTC" "2015-12-16 13:00:00 UTC" "0092-08-06 03:00:00 UTC" "2011-06-14 04:00:00 UTC"
[7] "2014-10-31 00:52:00 UTC" "2014-06-15 14:37:00 UTC" "2006-02-10 00:00:00 UTC" "0095-06-26 00:00:00 UTC" "0082-10-03 00:00:00 UTC"

问题在于它在两位数的年份中出现了错误。令人惊讶的是,这很好用:

parse_date_time(test[2], orders=orders[1], truncated=2)
[1] "2012-05-23 UTC"

?parse_date_time中有一条注释:

  

注意:ymd系列函数基于strptime,目前无法解析%y-%m格式。

但这不适用于此,因为1)我有一天和2)它似乎工作,当我只有一年w / o世纪的日期。我认为我的规范中的问题在于它如何与猜测/训练相互作用。

我认为,Lubridate非常接近使这项令人厌烦的任务变得更加容易。有没有办法让lubridate或任何其他方法一般地解析test中的日期?

1 个答案:

答案 0 :(得分:1)

This answer只能解决错误世纪的特殊症状;虽然这是我在测试数据中发现的唯一问题。我很高兴看到别人的方法来强有力地转换日期;如果我已经学到了什么,那就是日期格式总会有更多的惊喜,而且它们通常都有解决方案。但就目前而言,通过严重依赖链接的答案,这是我最好的:

foo <- function(x, orders, year=1940, ...){
  requireNamespace("lubridate", quietly=TRUE)
  x <- lubridate::parse_date_time(x, orders=orders, ...)
  m <- lubridate::year(x) %% 100
  year(x) <- ifelse(m > year %% 100, 1900+m, 2000+m)
  x
}

orders <- paste(rep(c("ymd", "mdy", "Ymd"),each=3), c("HM","H","M"))
foo(test, orders, truncated=2)

 [1] "2012-11-11 00:00:00 UTC" "2012-05-23 00:00:00 UTC" "1986-12-05 00:00:00 UTC" "2015-12-16 13:00:00 UTC" "1992-08-06 03:00:00 UTC" "2011-06-14 04:00:00 UTC"
 [7] "2014-10-31 00:52:00 UTC" "2014-06-15 14:37:00 UTC" "2006-02-10 00:00:00 UTC" "1995-06-26 00:00:00 UTC" "1982-10-03 00:00:00 UTC"

year参数应该基本上是您的字符日期向量x中出现的最早年份。

相关问题