首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从R中的字符串中获取日期/时间

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

Stack Overflow用户
提问于 2013-06-07 14:48:11
回答 3查看 1.6K关注 0票数 3

我有一根线让我们这样说

安吉说:2013年5月13日上午10点55分,你在摇滚

而且,我想把它的日期

2013年5月13日

我能在R区做这件事吗?我尝试了以下方式的strptime函数:

代码语言:javascript
复制
strptime("Ankit says: May 13, 2013 at 10:55 am you rock", " %b %d, %Y")

我得到了"NA"

但是当我在约会前一言不发的时候

代码语言:javascript
复制
strptime("May 13, 2013 at 10:55 am you rock", " %b %d, %Y")

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

我也试过像

代码语言:javascript
复制
grep("Ankit says: May 13, 2013 at 10:55 am you rock", "?(?:[a-zA-Z]*)(\\s+)(?:[0-9]*)(,)(\\s+)(?:[0-9]*)")
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-07 15:12:37

谢谢你展示你尝试过的东西。假设所有日期时间都具有相同的格式,则可以使用以下方法:

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2013-06-07 15:32:48

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

代码语言:javascript
复制
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")

这给

代码语言:javascript
复制
[1] "2013-05-13 10:55:00 EDT" "2013-06-06 23:18:00 EDT"

更新:更正

票数 5
EN

Stack Overflow用户

发布于 2013-06-07 15:16:03

第二次尝试你走的是正确的道路。只需使用strsplit处理日期之前的所有内容,split参数为says:

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

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

代码语言:javascript
复制
strptime(do.call(rbind,strsplit(your_log_as_a_vector, "says: "))[,2],
         format = "%b %d, %Y")

编辑:确实存在一个问题,即字符串稍后可以包含says:。然后,以下内容就可以工作了(因为即使有第二个says,它总是在日期之后出现,所以包含日期的块总是第二个):

代码语言:javascript
复制
 strptime(sapply(strsplit(your_log_as_a_vector, "says: "),`[`,2),
         format = "%b %d, %Y")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16986968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档