Hope everyone is having a nice Thanksgiving. I'm having a bit of trouble formatting times in my data frame, in such a way that they are usable. They are currently formatted as follows: 9m2.75s, which indicates 9 minutes and 2.75 seconds.
This indicates the number of minutes and seconds. I am trying to parse it in such a way that it can be read into a plot as a time. Any ideas on this would be useful. I've been stuck on it for a while.
This will get you a date time object from strings with that format, and from there you can pick the components for plot
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#>
#> date
exemplar <- "9m2.75s"
parse_date_time(exemplar, "MS")
#> [1] "0000-01-01 00:09:03 UTC"
Created on 2019-11-28 by the reprex package (v0.3.0)
Great, glad that worked. For the benefit of those who follow, please mark this as a solution to make it easier to find. In the words of the old song
penny a point, ain't no one keepin' score
1 Like
A brief follow up to this. Any ideas on how to convert to a "duration"? In other words, instead of 00:01:30, I just want this to be 90.
1 Like
On second thought, going down the rabbit hole into date time may not be the best way to end up with a number of seconds if, indeed, you're dealing solely with "9m2.75s"
that you want to convert to integers.
Here is a clunky example of taking this as a string parsing and conversion problem. Needs adjustment, obviously, if fractional seconds are not guaranteed in the input.
library(stringr)
get_secs <- function(x) {
pattern <- "\\d+"
str_extract_all(x, pattern)
}
make_secs <- function(x) {
big_secs <- as.integer(x[[1]][1]) * 60
reg_secs <- as.integer(x[[1]][2])
frac_secs <- ifelse(as.integer(x[[1]][3]) > 49, 1, 0)
tot_secs <- big_secs + reg_secs + frac_secs
}
exemplar <- "9m2.75s"
sec_chars <- get_secs(exemplar)
result <- get_secs(exemplar) %>% make_secs()
result
#> [1] 543
Created on 2019-11-28 by the reprex package (v0.3.0)
You can get a more flexible function with regular expressions
library(stringr)
get_seconds <- function(x) {
res <- as.numeric(str_match(x, "(\\d+).(\\d{1,2}\\.?\\d{0,2}).")[2:3])
res[1]*60+res[2]
}
get_seconds("9m2.75s")
#> [1] 542.75
round(get_seconds("9m2.75s"))
#> [1] 543
get_seconds("12m2s")
#> [1] 722
2 Likes