我有一列时间值,除了它们是字符格式并且没有用于分隔H,M,S的冒号。该列看起来类似于以下内容:
Time
024201
054722
213024
205022
205024
125440
我想将列中的所有值转换为H:M:S
格式的实际时间值。这些值已经是HMS
格式,所以它只是插入冒号的问题,但事实证明这比我想象的要困难。我找到了一个从右边每三位数添加逗号的包,使字符串看起来像货币值,但没有时间(没有添加日期值,我不想这样做)。任何帮助将不胜感激。
答案 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
部分。