2016-05-29 32 views
2

Ich bin neu in der R-Statistik-Software und röste Kaffee und zeichne verschiedene Ereignisse während des Prozesses auf. Nach dem Röstvorgang eine Berechnung und Analyse zu tun und leiten wichtige Dauern während der Laufzeit zu finden, die Zeitspanne zwischen Ereignissen Ich mag R verwenden - zum Beispiel:Berechnungen mit Minuten und Sekunden in R

  • 00:00 starten
  • 05:10 Yellow
  • 07:15 Cinnamon
  • 09:00 Erster Sprung
  • 11:30 Ende der Röstung

(wenn Sie ein Kaffee-aussenseiter sind und möchten mehr über Kaffeeröstparameter wissen: https://coffee-mind.com/profile/)

Wie/in welchem ​​Format kann ich diese Ereignisse speichern und die Zeitspanne zwischen Ereignissen berechnen? Ich möchte die Zeitspanne in MM: SS zeigen, aber auch die gesamten Sekunden in einer MM: SS-Periode sehen. Ich habe mir die verschiedenen Pakete angeschaut (wie chron und lubridate), aber alle scheinen sich um Zeitzone, absolute Daten und so weiter zu kümmern und ich bin nur an Minuten und Sekunden interessiert (unabhängig von Tag und Zeitzone - nicht interessant überhaupt hier) und wie man Berechnungen wie einfache Subtraktionen an diesen aufgezeichneten Ereignissen durchführt. Ich bin nicht daran interessiert, wie man den Code schreibt, sondern in Funktionen (wie chron und lubridate), die bereits dafür entwickelt sind und wie man sie direkt benutzt (was ich auch für den allgemein interessantesten Ansatz für diese Community halte).)

Antwort

4

lubridate bietet die Funktionalität arbeiten können, die Sie benötigen. Neben der Klasse POSIXct, die Datum und Uhrzeit enthält, bietet sie auch die Klasse period für die Dauer an. Sie können Ihre Zeit in %M:%S Format period wie folgt konvertieren:

library(lubridate) 
times <- c("00:00", "05:10", "07:15", "09:00", "11:30") 
ms(times) 
## [1] "0S"  "5M 10S" "7M 15S" "9M 0S" "11M 30S" 

Sie dann as.period() auf die Zeiteinheit konvertieren können Sie sich wünschen:

as.period(ms(times), unit = "sec") 
## [1] "0S" "310S" "435S" "540S" "690S" 

Wenn Sie jetzt auf numerische konvertieren, werden Sie Holen Sie sich die Sekunden als Zahlen:

Sie können jetzt die Differenz in Sekunden zwischen den Ereignissen miterhalten:

diff(seconds) 
##[1] 310 125 105 150 

anzumerken, dass es in anderen Formaten andere Varianten der Funktion ms() für Zeiten ist: hm() (% H:% M:% S) und hms() (% H:% M).

+0

Great!Ich werde es versuchen :-) –

+0

Ich hatte das kleine Problem, dass meine Zeiten beim Kaffeerösten Minuten und nicht Stunden sind, also habe ich einige wirklich große Werte, wenn ich den obigen Code probiere. Ich fand heraus, dass die hms-Funktion die richtige für das Kaffeerösten ist, da sie 05:10 als "fünf Minuten und 10 Sekunden" interpretiert, wobei die hm-Funktion dies als "5 Stunden und 10 Minuten" interpretiert. Vielen Dank für Ihren Text, der meine Frage vollständig mit dem hm -> hms gelöst hat, als die einzige Änderung, die ich machen musste, damit es für meinen Zweck funktioniert! Wenn Sie jemals in Kopenhagen sind, können Sie einen Röstkurs kostenlos nehmen :-) https://coffee-mind.com/shop –

+0

Es tut mir leid für diesen Fehler. Ich war nicht vorsichtig genug beim Lesen deiner Frage und nahm einfach an, du meintest% H:% M. Ich bin froh, dass Sie selbst herausgefunden haben, wie Sie die Lösung anpassen können, aber ich habe noch einige Änderungen an der Antwort vorgenommen. Viel Glück mit deinem Kaffee! – Stibu

1

Nun, nicht sicher, ob das hilft, aber ich habe diese Funktion gemacht, wenn ich die Zeitspanne von Youtube-Videos in Sekunde konvertieren musste. Sie sind formatiert hh: mm: ss, so dass es für Sie, wenn Sie Eingabe einen Vektor mit Zeiten wie in Ihrem Beispiel

toseconds<-function(x){ 
    sec<-rep(NA,length(x)) 
    minu<-rep(NA,length(x)) 
    hodina<-rep(NA,length(x)) 
    total<-rep(NA,length(x)) 
    for (i in 1:length(x)) { 
    if (str_count(x[i],":")==2) { 
     sec[i]<-as.numeric(str_sub(str_replace(x[i],":",""),str_locate(str_replace(x[i],":",""),":")[ ,1]+1)) 
     minu[i]<-as.numeric(str_sub(x[i],str_locate(x[i],":")[ ,1]+1,str_locate(x[i],":")[ ,1]+2)) 
     hodina[i]<-as.numeric(str_sub(x[i],1,str_locate(x[i],":")[ ,1]-1)) 
    } else { 
     sec[i]<- as.numeric(str_sub(x[i],str_locate(x[i],":")[ ,1]+1)) 
     minu[i]<-as.numeric(str_sub(x[i],1,str_locate(x[i],":")[ ,1]-1)) 
     hodina[i]<-0 
    } 

    total[i]<-hodina[i]*3600+minu[i]*60+sec[i] 
    } 

    total 
} 
+0

Danke für den Code :-) –

0

Laden eine andere Bibliothek zu vermeiden ...

MinSeg=function(fim, ini){ 
    dif=as.numeric(difftime(fim, ini, units='min')) 
    return(paste0(sprintf('%02d', as.integer(dif)), ":" 
       ,sprintf('%02.0f', (dif-as.integer(dif))*60))) 
} 
ini=Sys.time() 
fim=Sys.time() 
MinSeg(fim,ini) 
[1] "00:03" 
Verwandte Themen