在空间和第一个之间提取字符":"

时间:2016-10-29 03:59:00

标签: r regex

我试图从具有日期和时间的变量中提取小时(仅)。有几个问题解释了如何从%H:%M中提取%m/%d/%Y %H:%M,但我的数据的结构为%m/%d/%Y %H:%M用于某些观察,而%m/%d/%Y %H:%M:%S用于其他观察。此外,我不是每小时都有两个diigits(一个数字小时是一位数,没有前导零)。因此使用以下内容将无效:

 df$hour <- format(as.POSIXct(citistation$starttime, format="%m/%d/%Y %H:%M:%S"), format="%H")

我的数据样本:

 date <- c("1/1/2013 0:01","12/31/2013 21:49:19")

我倾向于在空间和第一个之间提取数字的东西&#34;:&#34;。有什么建议?感谢。

3 个答案:

答案 0 :(得分:3)

我们可以使用sub。匹配一个或多个非空格(\\S+),后跟一个或多个空格(\\s+),捕获不是:的一个或多个字符(([^:]+) )后跟一个:和字符,直到字符串结尾,将其替换为捕获组的反向引用(\\1)。

sub("\\S+\\s+([^:]+):.*", "\\1", date)
#[1] "0"  "21"

最好转换为&#39; DateTime&#39;类并提取hour

library(lubridate)
hour(parse_date_time(date, c('mdy_HM', 'mdy_HMS')))
#[1]  0 21

数据

date <- c('1/1/2013 0:01','12/31/2013 21:49:19')

答案 1 :(得分:1)

as.POSIXct的字符参数中的尾随材质被忽略,因此您可以将'format'参数缩短为:

format(as.POSIXct(date, format="%m/%d/%Y %H:%M"), format="%H")
#[1] "00" "21"

答案 2 :(得分:0)

这也有效:

library(stringr)
str_match(c("1/1/2013 0:01","12/31/2013 21:49:19"), "\\s+([0-9]+):")[,2]
#[1] "0"  "21"