Как преобразовать десятичное время в формат времени

Я хотел бы рассчитать разницу между двумя наборами времени. Я могу это сделать, но я получаю разницу только в десятичных знаках, и я хотел бы знать, как преобразовать их в формат, как в «Минуты: секунды».

Итак, у меня есть минуты и секунды как символы:

video_begin <- c("8:14", "4:47", "8:27", "4:59", "4:57", "7:51", "6:11", "5:30")
video_end <- c("39:08", "47:10", "49:51", "44:31", "39:41", "47:12", "40:13", "46:52")

Я конвертирую их в значения времени с помощью as.POSIXct, делаю df и добавляю разницу в третий столбец, легко...

video_begin <- as.POSIXct(video_begin, format = "%M:%S")
video_end <- as.POSIXct(video_end, format = "%M:%S")
video <- data.frame(video_begin, video_end)
video$video_duration <- video_end - video_begin

И вот что я получаю за video:

  video_begin         video_end            video_duration
1 2017-09-12 00:08:14 2017-09-12 00:39:08  30.90000 mins
2 2017-09-12 00:04:47 2017-09-12 00:47:10  42.38333 mins
3 2017-09-12 00:08:27 2017-09-12 00:49:51  41.40000 mins
4 2017-09-12 00:04:59 2017-09-12 00:44:31  39.53333 mins
5 2017-09-12 00:04:57 2017-09-12 00:39:41  34.73333 mins
6 2017-09-12 00:07:51 2017-09-12 00:47:12  39.35000 mins
7 2017-09-12 00:06:11 2017-09-12 00:40:13  34.03333 mins
8 2017-09-12 00:05:30 2017-09-12 00:46:52  41.36667 mins

Как изменить формат video$video_duration с десятичного на тот же формат, что и в video$video_begin и video$video_end: «Минуты:Секунды» (мне не важны день, месяц, год и час)?

Я старался:

video$video_duration <- as.POSIXct(video$video_duration, format = "%M:%S")

а также

strptime(video$video_duration, format="%M:%S")

но неее...

Я нашел несколько ответов, но я не очень ими доволен:

Как преобразовать десятичное время в POSIX

Алгоритм преобразования текстового времени в десятичное время

Разве нет более... удобного и простого способа сделать это?

Спасибо!


person KDBoom    schedule 12.09.2017    source источник


Ответы (3)


Другой вариант:

library(lubridate)
video$video_duration <- as.numeric(video_end - video_begin, units = "secs")
video$video_duration  <- seconds_to_period(video$video_duration)

          video_begin           video_end video_duration
1 2017-09-12 00:08:14 2017-09-12 00:39:08        30M 54S
2 2017-09-12 00:04:47 2017-09-12 00:47:10        42M 23S
3 2017-09-12 00:08:27 2017-09-12 00:49:51        41M 24S
4 2017-09-12 00:04:59 2017-09-12 00:44:31        39M 32S
5 2017-09-12 00:04:57 2017-09-12 00:39:41        34M 44S
6 2017-09-12 00:07:51 2017-09-12 00:47:12        39M 21S
7 2017-09-12 00:06:11 2017-09-12 00:40:13         34M 2S
8 2017-09-12 00:05:30 2017-09-12 00:46:52        41M 22S
person Edgar Santos    schedule 12.09.2017
comment
Это был именно тот ответ, который я искал! Я знал, что есть способ сделать это без большого количества кода. Спасибо! - person KDBoom; 17.09.2017

Это создает формат MM:SS:

df$video_duration <- gsub('\\s+[[:alpha:]]{4}','',df$video_duration)
x <- as.numeric(df$video_duration)
paste(floor(x), round((x-floor(x))*60), sep=":")

Выход:

[1] "30:54" "42:23" "41:24" "39:32" "34:44" "39:21" "34:2"  "41:22"
person www    schedule 12.09.2017
comment
Спасибо, это может сработать, но я искал ответ, который требует немного меньшего количества кодирования. Другие ответы, которые я нашел раньше, тоже работали, но все они были не очень удобными. В любом случае, спасибо! - person KDBoom; 17.09.2017

Использование difftime в функции. Может быть более элегантное решение, но оно работает и является гибким.

time_diff <- function(time1, time2){
  hours <- difftime(time1, time2, units="hours")
  minutes <- round(60 * (hours - floor(hours)), 0)

  paste(floor(hours), minutes, sep=":")
}
time_diff(video_end, video_begin)

дает

[1] "0:31" "0:42" "0:41" "0:40" "0:35" "0:39" "0:34" "0:41"
person Remko Duursma    schedule 12.09.2017
comment
Это может сработать, но, если честно, для меня это слишком! :) В любом случае, спасибо! - person KDBoom; 17.09.2017