3

我有一个字符串可以这样说

Ankit 说: 2013 年 5 月 13 日上午 10:55,你摇滚

而且,我希望从中获取日期

2013 年 5 月 13 日

有什么办法可以在 R 中做到这一点吗?我已经通过以下方式尝试了 strptime 函数:

strptime("Ankit says: May 13, 2013 at 10:55 am you rock", " %b %d, %Y")

我明白了"NA"

但是当我在日期之前没有任何文字地尝试它时

strptime("May 13, 2013 at 10:55 am you rock", " %b %d, %Y")

我得到输出"2013-05-13"

我也尝试过正则表达式

grep("Ankit says: May 13, 2013 at 10:55 am you rock", "?(?:[a-zA-Z]*)(\\s+)(?:[0-9]*)(,)(\\s+)(?:[0-9]*)")
4

3 回答 3

5

这使用strapply来自gsubfn 包。它将正则表达式pat与每个字符串匹配,将匹配正则表达式括号部分的子字符串作为单独的参数传递给to.POSIXct,然后最终组装该函数的输出。我们假设每个实例中存在相同的日期和时间格式,但没有对周围的文本做出太多假设:

library(gsubfn)
s <- c("Ankit says: May 13, 2013 at 10:55 am you rock", 
            "The date is Jun 6, 2013 and the time is 11:18 pm")

pat <- "(\\w+ \\d{1,2}, \\d{4}).*(\\d{2}:\\d{2} [ap]m)"
to.POSIXct <- function(d, t) as.POSIXct(paste(d, t), format = "%b %d, %Y %I:%M %p")
strapply(s, pat, to.POSIXct, simplify = "c")

这使

[1] "2013-05-13 10:55:00 EDT" "2013-06-06 23:18:00 EDT"

更新:更正

于 2013-06-07T15:32:48.550 回答
3

感谢您展示您的尝试。假设所有日期时间都具有相同的格式,您可以使用:

s <- "Ankit says: May 13, 2013 at 10:55 am you rock"
month.abb.pattern <- paste(month.abb,collapse="|")
datetime.fmt <- "%b %d, %Y at %I:%M %p"
strptime(substr(s, regexpr(month.abb.pattern, s), nchar(s)), datetime.fmt)
于 2013-06-07T15:12:37.573 回答
1

通过第二次尝试,您就走在了正确的道路上。strsplit只需使用以下split参数删除日期之前的所有内容says:

strptime(strsplit("Ankit says: May 13, 2013 at 10:55 am you rock","says: ")[[1]][2],
         format= "%b %d, %Y")
[1] "2013-05-13"

如果您想将其自动化到许多日志条目:

strptime(do.call(rbind,strsplit(your_log_as_a_vector, "says: "))[,2],
         format = "%b %d, %Y")

编辑:确实存在字符串says:稍后可能包含的问题。然后以下将起作用(因为即使有一秒钟says它总是会出现在日期之后,所以包含日期的块将始终是第二个):

 strptime(sapply(strsplit(your_log_as_a_vector, "says: "),`[`,2),
         format = "%b %d, %Y")
于 2013-06-07T15:16:03.933 回答