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

Time:05-03

As the question states, I want to turn "130041" into "13:00:41" i.e. HMS data

lubridate::ymd("20220413") works no problems but lubridate::hms("130041") does not.

I assume there should be a reasonably simply solution?!

Thank you.

CodePudding user response:

If you need the output as a lubridate Period object, rather than a character vector, as you need to perform operations on it, you can use the approach suggested by Tim Biegeleisen of adding colon separators to the character vector and then using lubridate:

x <- "130041"

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

The output is similar but it is a Period object. I used a slightly different regex as well (add a colon when there are two digits not followed by the end of string) but it is fundamentally the same approach.

CodePudding user response:

You could use sub here:

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

[1] "13:00:41"

CodePudding user response:

Another regex which will will also work in case when hour uses only on digit.

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

Which can than be used in e.g. in lubridate::hms or hms::as_hms.

In base::as.difftime a format could be given: as.difftime("130041", "%H%M%S")

  • Related