2017-05-12 2 views
0

Ich muss Zeitintervalle im Format% H konvertieren:% M:% S (Klasse = Faktor) zu Klasse = Difftzeit. Ich bin derzeit as.difftime(), dies zu tun, aber es gibt NA, wenn die Stunde Wert> 23.R as.difftime() Problem für Zeiten länger als 1 Tag

TimeElapsed_raw = as.factor(c("03:59:59", "21:00:00", "01:03:46", "44:00:00", "24:59:59")) 
TimeElapsed = as.difftime(as.character(TimeElapsed_raw), format = "%H:%M:%S") 
TimeElapsed 

Time differences in hours 
[1] 3.999722 21.000000 1.062778  NA  NA 

ich das gleiche Problem haben, ob ich das Format Anweisung in as.difftime enthalten ():

as.difftime("65:01:17") 
Time difference of NA secs 

aber das funktioniert:

as.difftime(65.1, units = "hours") 
Time difference of 65.1 hours 

ich auch die lubridate as.duration() -Funktion versucht verwendet haben, aber die Werte berechnet es unsinnig erscheinen.

as.duration(TimeElapsed_raw) 
[1] "2s" "3s" "1s" "5s" "4s" 

Jede Hilfe wäre willkommen!

+2

Das funktioniert nur mit einem numerischen. Weil ich meine Daten von einem csv mit ':' darin lese, kann ich es nur als Faktor oder Charakter formatieren. Der Versuch, as.numeric() für die Werte zu verwenden, gibt mir nur NAs. – pradlee

Antwort

0

Sie könnten zunächst das Format der Daten zu xH xM xS ändern, die durch die duration Funktion in lubridate verstanden wird:

x=gsub("(^\\d{2}):(\\d{2}):(\\d{2})$","\\1H \\2M \\3S",as.character(TimeElapsed_raw)) 
[1] "03H 59M 59S" "21H 00M 00S" "01H 03M 46S" "44H 00M 00S" "24H 59M 59S" 

Und dann duration gelten:

duration(x) 
[1] "14399s (~4 hours)"  "75661s (~21.02 hours)" "3826s (~1.06 hours)" 
[4] "158461s (~1.83 days)" "89999s (~1.04 days)" 

Andernfalls Unter Verwendung von as.difftime können Sie Ihre Daten zuerst in Stunden, Minuten und Sekunden aufteilen und sie dann einzeln an as.difftime:

v=lapply(strsplit(TimeElapsed_raw,":"),function(x) {as.difftime(as.numeric(x[1]),units="hours")+as.difftime(as.numeric(x[2]),units="mins")+as.difftime(as.numeric(x[3]),units="secs")}) 

[[1]] 
Time difference of 14399 secs 

[[2]] 
Time difference of 75600 secs 

[[3]] 
Time difference of 3826 secs 

[[4]] 
Time difference of 158400 secs 

[[5]] 
Time difference of 89999 secs 

Wenn Sie die Liste in einen Vektor umwandeln möchten, stellen Sie sicher, dass es zu difftime danach zurückzuverwandeln als unlist die Klasse verliert.

v=as.difftime(unlist(v),unit="secs") 
+0

Was ist, wenn ich die Dauer in Stunden ausgeben möchte, nicht in Sekunden? Wenn ich im Schritt unlist() einfach die Einheit auf "Stunden" ändere, bleiben die Werte selbst gleich. Z.B. "Zeitunterschied von 14399 Sekunden" im Schritt "lapply()" wird als "Zeitunterschied von 14399 Stunden" gespeichert. – pradlee

+0

Nach dem 'unlist()' wird 'v' als 'numerisch' betrachtet. Wenn Sie also' as.difftime() 'anwenden, müssen Sie angeben, dass Ihre Eingabe in Sekunden erfolgt. Wenn Sie danach die Einheit eines 'difftime'-Objekts in Stunden ändern wollen, tun Sie einfach' units (v) = "hours" '. – Lamia

Verwandte Themen