从R中的字符串中获取日期/时间

时间:2013-06-07 14:48:12

标签: regex r datetime

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

  

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]*)")

3 个答案:

答案 0 :(得分:5)

这会使用gsubfn package中的strapply。它将正则表达式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"

更新:更正

答案 1 :(得分:2)

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

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)

答案 2 :(得分: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")