我试图从具有日期和时间的变量中提取小时(仅)。有几个问题解释了如何从%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;。有什么建议?感谢。
答案 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"