我正在尝试将字符转换为日期。日期具有异构格式,我宁愿不必单独编码每种日期格式(并指定哪些格式属于哪些元素,例如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
中的日期?
答案 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
中出现的最早年份。