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::hms
或 hms::as_hms
.
在base::as.difftime
中可以给出一个格式:as.difftime("130041", "%H%M%S")
如问题所述,我想将“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::hms
或 hms::as_hms
.
在base::as.difftime
中可以给出一个格式:as.difftime("130041", "%H%M%S")