gpt4 book ai didi

regex - RobuSTLy 解析 R 中可变格式的日期

转载 作者:行者123 更新时间:2023-12-02 03:19:45 26 4
gpt4 key购买 nike

我正在尝试将字符转换为日期。日期具有不同的格式,我希望不必分别对每个日期格式进行编码(并指定哪些格式属于哪些元素,例如通过 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"

问题是它在 2 位数年份上弄错了世纪。令人惊讶的是,这工作正常:

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

?parse_date_time中有一个注释:

NOTE: ymd family of functions are based on strptime which currently fails to parse %y-%m formats.

但这不应该在这里应用,因为 1) 我有一天,并且 2) 当我只有一个没有世纪的日期时,它似乎有效。我认为我的规范中的问题在于它如何与猜测/训练相互作用。

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

最佳答案

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

关于regex - RobuSTLy 解析 R 中可变格式的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34320029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com