5

我如何"1330"变成"13:30",或"133000"变成"13:30:00"?本质上,我想在每对数字之间插入一个冒号。我正在尝试将字符转换为时间。

似乎应该有一种非常优雅的方式来做到这一点,但我想不出。paste()我正在考虑使用and的某种组合substr(),但一个优雅的解决方案正在逃避我。

编辑:需要转换的示例字符串:

X <-   c("120000", "120500", "121000", "121500", "122000", "122500", "123000") #example of noon to 12:30pm
4

4 回答 4

8

您可以使用正则表达式和积极的前瞻

gsub("(\\d{2})(?=\\d{2})", "\\1:", X, perl = TRUE)
# [1] "12:00:00" "12:05:00" "12:10:00" "12:15:00" "12:20:00" "12:25:00" "12:30:00"
于 2013-05-09T01:55:37.197 回答
8

这会将每个不带边界的两个字符序列替换为相同的字符后跟冒号:

gsub("(..)\\B", "\\1:", X)

在它给出的示例字符串上:

[1] "12:00:00" "12:05:00" "12:10:00" "12:15:00" "12:20:00" "12:25:00" "12:30:00"
于 2013-05-09T03:17:53.763 回答
3

使用substring

test <- "1330"
paste(substring(test,seq(1,nchar(test)-1,2),seq(2,nchar(test),2)),collapse=":")

#[1] "13:30"


test <- "133000"
paste(substring(test,seq(1,nchar(test)-1,2),seq(2,nchar(test),2)),collapse=":")

#[1] "13:30:00"

或者,如果您想要一个实际的时间表示,您可以这样做:

test <- "1330"
as.POSIXct(test,format="%H%M")
#[1] "2013-05-09 13:30:00 EST"

您可以像这样重新格式化:

format(as.POSIXct(test,format="%H%M"),"%H:%M")
#[1] "13:30"
于 2013-05-09T01:52:33.350 回答
1

可以通过 strptime 一步完成:

strptime(X, format="%H%M%S")
[1] "2013-05-08 12:00:00" "2013-05-08 12:05:00" "2013-05-08 12:10:00" "2013-05-08 12:15:00" "2013-05-08 12:20:00"
[6] "2013-05-08 12:25:00" "2013-05-08 12:30:00"

在对日期时间对象中的日期进行投诉之后,可以通过以下方式压制这种“人造”现实:

strftime( strptime(X, format="%H%M%S"), "%H:%M:%S" )
[1] "12:00:00" "12:05:00" "12:10:00" "12:15:00" "12:20:00" "12:25:00" "12:30:00"
于 2013-05-09T05:15:24.057 回答