在空格和第一个“:”之间提取字符。

3

我正在尝试从一个包含日期和时间的变量中仅提取小时。有几个问题解释了如何从%m/%d/%Y %H:%M中提取%H:%M,但我的数据结构为对于某些观测值为%m/%d/%Y %H:%M,对于其他观测值为%m/%d/%Y %H:%M:%S。此外,我的小时数不总是两位数(一位数小时在一位数中,没有前导零)。因此,以下方法将无法使用:

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

我倾向于使用一种方法来提取空格和第一个“:”之间的数字。有什么建议吗?谢谢。

3个回答

3
我们可以使用sub。匹配一个或多个非空格字符(\\S+),后跟一个或多个空格字符(\\s+),捕获一个或多个不是:的字符(([^:]+)),后跟一个:和字符串的结尾的字符,用捕获组的反向引用(\\1)替换它。
sub("\\S+\\s+([^:]+):.*", "\\1", date)
#[1] "0"  "21"

最好将其转换为“DateTime”类并提取“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')

@AgustinIndaco 我之前不确定它是一个字符串还是两个字符串。 - akrun

1
在as.POSIXct中,字符参数中的尾随材料将被忽略,因此您可以缩短“format”参数:
format(as.POSIXct(date, format="%m/%d/%Y %H:%M"), format="%H")
#[1] "00" "21"

0

这个也可以:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接