我有一根线让我们这样说
安吉说: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]*)")发布于 2013-06-07 15:12:37
谢谢你展示你尝试过的东西。假设所有日期时间都具有相同的格式,则可以使用以下方法:
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-07 15:32:48
这使用了来自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-07 15:16:03
第二次尝试你走的是正确的道路。只需使用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")https://stackoverflow.com/questions/16986968
复制相似问题