如何每两个字符插入一个冒号?

时间:2014-01-05 01:51:50

标签: r

我有一列时间值,除了它们是字符格式并且没有用于分隔H,M,S的冒号。该列看起来类似于以下内容:

Time
024201
054722
213024
205022
205024
125440 

我想将列中的所有值转换为H:M:S格式的实际时间值。这些值已经是HMS格式,所以它只是插入冒号的问题,但事实证明这比我想象的要困难。我找到了一个从右边每三位数添加逗号的包,使字符串看起来像货币值,但没有时间(没有添加日期值,我不想这样做)。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:7)

由于数据与时间有关,因此应考虑将其存储为POSIX格式:

> df <- data.frame(Time=c("024201", "054722", "213024", "205022", "205024", "125440")
> df$Time <- as.POSIXct(df$Time, format="%H%M%S")
> df

                 Time
1 2014-01-05 02:42:01
2 2014-01-05 05:47:22
3 2014-01-05 21:30:24
4 2014-01-05 20:50:22
5 2014-01-05 20:50:24
6 2014-01-05 12:54:40

只输出时间:

> format(df, "%H:%M:%S")
      Time
1 02:42:01
2 05:47:22
3 21:30:24
4 20:50:22
5 20:50:24
6 12:54:40

答案 1 :(得分:6)

带有环视的正则表达式适用于此:

gsub('(..)(?=.)', '\\1:', x$Time, perl=TRUE)

(?=.)表示必须跟随一个字符(由.匹配),但不会被视为匹配的一部分(并且不会被捕获)。

答案 2 :(得分:3)

这是一个正则表达式解决方案:

x <- readLines(n=6)
024201
054722
213024
205022
205024
125440 

gsub("(\\d\\d)(\\d\\d)(\\d\\d)", "\\1:\\2:\\3", x)

## [1] "02:42:01"  "05:47:22"  "21:30:24" 
## [4] "20:50:22"  "20:50:24"  "12:54:40 "

(\\d\\d)表示我们正在寻找2位数。括号将字符串分成3部分。然后\\1:说取大块1并在其后面放一个冒号。

答案 3 :(得分:2)

或通过日期/时间类:

time <- c("024201", "054722", "213024", "205022", "205024", "125440")
time <- as.POSIXct(paste0("1970-01-01", time), format="%Y-%d-%m %H%M%S")
(time <- format(time, "%H:%M:%S"))
# [1] "02:42:01" "05:47:22" "21:30:24" "20:50:22" "20:50:24" "12:54:40"

答案 4 :(得分:0)

这会给出chron“次”类向量:

> library(chron)
> times(gsub("(..)(..)(..)", "\\1:\\2:\\3", DF$Time))
[1] 02:42:01 05:47:22 21:30:24 20:50:22 20:50:24 12:54:40

“时代”类可以显示时间而无需显示日期并支持各种时间方法。

另一方面,如果只需要一个字符串,那么只需要gsub部分。