R 将 6 位数字转换为 HMS 即“130041”转换为“13:00:41”

R turn 6 digit number into HMS i.e. "130041" into "13:00:41"

如问题所述,我想将“130041”变成“13:00:41”,即 HMS 数据

lubridate::ymd("20220413") 没有问题,但 lubridate::hms("130041") 没有。

我认为应该有一个相当简单的解决方案?!

谢谢。

您可以在此处使用 sub

x <- "130041"
output <- sub("(\d{2})(\d{2})(\d{2})", "\1:\2:\3", x)
output

[1] "13:00:41"

如果您需要将输出作为 lubridate Period 对象而不是字符向量,因为您需要对其执行操作,您可以使用 Tim Biegeleisen 建议的方法,将冒号分隔符添加到字符向量,然后使用 lubridate:

x <- "130041"

gsub("(\d{2})(?!$)", "\1:", x, perl = TRUE) |> 
    lubridate::hms() 
# [1] "13H 0M 41S" 

输出类似,但它是一个 Period 对象。我也使用了一个稍微不同的正则表达式(当字符串末尾后面没有两位数字时添加一个冒号)但它基本上是相同的方法。

另一个正则表达式,它也可以在小时仅用于数字的情况下使用。

gsub("(?=(..){1,2}$)", ":", c("130041", "30041"), perl=TRUE)
#[1] "13:00:41" "3:00:41" 

哪个可以用在例如在 lubridate::hmshms::as_hms.

base::as.difftime中可以给出一个格式:as.difftime("130041", "%H%M%S")