2017-09-12 3 views
0

Je voudrais calculer la différence entre deux périodes. Je peux le faire, mais je n'ai que la différence en décimales et je voudrais savoir comment les convertir au format comme dans "Minutes: Second".Comment convertir un format décimal en un temps

Alors, j'ai les minutes et les secondes sous forme de caractères:

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") 

je les convertir en valeurs de temps avec as.POSIXct, faire une df et ajouter la différence en tant que troisième colonne, facile comme bonjour .. .

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 

Et voici ce que je reçois pour 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 

Comment est-ce que je change le format de video$video_duration de la décimale au même format que dans video$video_begin et video$video_end: "Minutes: Seconds" (je me fiche du jour, du mois, de l'année et de l'heure)?

J'ai essayé:

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

et

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

mais nah ...

J'ai trouvé quelques réponses, mais je ne suis pas très satisfait avec eux:

How convert decimal to POSIX time

Algorithm to convert Text time to Decimal Time

Y a-t-il un moyen plus pratique et plus pratique de le faire?

Merci!

Répondre

1

Une autre option:

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 
+1

C'était exactement la réponse que je cherchais! Je savais qu'il y avait un moyen de le faire sans beaucoup de code. Merci! – KDBoom

1

Cela crée 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=":") 

Sortie:

[1] "30:54" "42:23" "41:24" "39:32" "34:44" "39:21" "34:2" "41:22" 
+0

Merci, ça pourrait fonctionner, mais je cherchais une réponse qui implique un peu moins de codage. Les autres réponses que j'ai trouvées avant fonctionnaient aussi bien mais elles n'étaient pas très "maniables". Merci quand même! – KDBoom

1

L'utilisation difftime enveloppé dans une fonction. Il peut y avoir une solution plus élégante mais bon, ça marche et c'est flexible.

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) 

donne

[1] "0:31" "0:42" "0:41" "0:40" "0:35" "0:39" "0:34" "0:41" 
+0

Ça pourrait marcher mais pour être très honnête c'est un peu trop pour moi! :) Merci quand même! – KDBoom