繁体   English   中英

在 r 中将格式 %H %M %S(无前导 0)转换为 HH:MM:SS

[英]Converting format %H %M %S (no leading 0s) to HH:MM:SS in r

我意识到这可能是一个非常基本的问题,但我正处于时间紧迫的状态,我一生都无法弄清楚这一点。 当这些值不是两位数时,有人将我需要使用的此数据更改为 go 从 HH:MM:SS 到 %%H %%M %%S 而没有前导 0(所以可能更像 (%)%H (%)% M (%)%S 如果有意义的话)。 例如,10:32:20 将表示为 10H 32M 20S。 我可以很好地处理这个。 但是,如果是 7:30:04,例如,它将是 7H 30M 4S。 我不明白为什么有人会使用这种格式 - 这是某些 package 中的标准吗?

我正在寻找一种将其转换为 HH:MM:SS 格式/将其解析为时间 object 的方法。

我最初只意识到秒数缺少前导 0,所以这就是这个公式的用途..

# turn e.g. 10H 12M 30S -> 10:12:30
df$Time = gsub(" ", "", c(df$Time))
df$Time = gsub("[^0-9]", ":", c(df$Time))
df$Time = gsub("::", ":", c(df$Time))
df$Time = substring(df$Time,1,nchar(df$Time) - 1)

 for (i in seq_along(df$Time)) {
   if (nchar(df$Time[i]) == 7) {
     gsub("([0-9]*$)", paste(0, str_sub(df$Time[i], start=7), sep=""), df$Time[i])
   }
}

这些看起来像来自lubridate package 的“周期”对象。 如果你想要 HH:MM:SS 格式的时间,你可以定义一个小转换器 function:

library(lubridate)

f <- function(x) substr(as.POSIXct("2022-01-01", tz = "GMT") + hms(x), 12, 19)

因此,例如:

times <- c("10H 12M 30S", "9H 53M 22S")

f(times)
#> [1] "10:12:30" "09:53:22"

使用reprex v2.0.2创建于 2022-09-04

实际上,甚至不需要加载 package。

x
# [1] "1H 33M 4S"   "3H 7M 5S"    "4H 3M 51S"   "4H 23M 22S" 
# [5] "4H 39M 33S"  "5H 19M 27S"  "5H 21M 2S"   "5H 29M 48S" 
# [9] "7H 41M 23S"  "9H 35M 1S"   "10H 27M 3S"  "13H 17M 53S"
# [13] "14H 42M 52S" "15H 32M 34S" "15H 57M 5S"  "17H 4M 44S" 
# [17] "17H 57M 49S" "18H 2M 55S"  "18H 21M 49S" "20H 14M 25S"

strptime(paste(Sys.Date(), x), '%F %HH %MM %SS') |>
  strftime('%R:%S')
# [1] "01:33:04" "03:07:05" "04:03:51" "04:23:22" "04:39:33"
# [6] "05:19:27" "05:21:02" "05:29:48" "07:41:23" "09:35:01"
# [11] "10:27:03" "13:17:53" "14:42:52" "15:32:34" "15:57:05"
# [16] "17:04:44" "17:57:49" "18:02:55" "18:21:49" "20:14:25"

数据:

x <- c("1H 33M 4S", "3H 7M 5S", "4H 3M 51S", "4H 23M 22S", "4H 39M 33S", 
"5H 19M 27S", "5H 21M 2S", "5H 29M 48S", "7H 41M 23S", "9H 35M 1S", 
"10H 27M 3S", "13H 17M 53S", "14H 42M 52S", "15H 32M 34S", "15H 57M 5S", 
"17H 4M 44S", "17H 57M 49S", "18H 2M 55S", "18H 21M 49S", "20H 14M 25S"
)

这是另一种方式。

convert_time <- function(x) {
  y <- gsub("[[:alpha:]] ", ":", x)
  y <- as.POSIXct(paste(Sys.Date(), y))
  sub("^[^ ]+ ", "", y)
}

x <- c("10H 32M 20S", "7H 30M 4S", "10H 12M 30S")
convert_time(x)
#> [1] "10:32:20" "07:30:04" "10:12:30"

代表 package (v2.0.1) 于 2022 年 9 月 4 日创建

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM