2016-10-24 3 views
3

Ich habe drei Mal (POSIXct) Objekte t1, t2, t3, die die Zeitdauer angeben, um eine Aufgabe abzuschließen.Teilen Sie zwei difftime Objekte

Ich fand t1, t2, t3 durch folgende Maßnahmen:

t1 <- as.POSIXct("2016-10-30 13:53:34") - as.POSIXct("2016-10-30 13:35:34") 
t2 <- as.POSIXct("2016-10-30 14:53:34") - as.POSIXct("2016-10-30 14:35:34") 
t3 <- as.POSIXct("2016-10-30 15:50:34") - as.POSIXct("2016-10-30 15:40:34") 

ich die Verhältnisse t1/t3 und t2/t3 finden möchten. Allerdings bekomme ich folgende Fehlermeldung:

t1/t3 
# Error in `/.difftime`(t1, t3) : 
# second argument of/cannot be a "difftime" object 

ich verstanden, dass zwei difftime Objekte können nicht geteilt werden. Gibt es eine Möglichkeit, das Ergebnis der Teilung von zwei difftime Objekte zu finden?

+1

Wollen Sie durch die Anzahl der Sekunden im Intervall teilen? Anzahl der Stunden? Anzahl der Tage? Geben Sie auch Code, der Ihre 't1',' t2' und 't3' kopiert. –

+0

Ich möchte es durch die Anzahl der Sekunden teilen. – Katherine

+2

Sie können ein 'difftime' Objekt' d' in Sekunden umwandeln mit 'as.numeric (d, units = 'secs')' –

Antwort

6

Um durch eine difftime zu teilen, müssen Sie es in numerische konvertieren. Die Konvertierung erfordert, dass Sie die Einheiten angeben. Zum Beispiel:

t1/as.double(t3, units='secs') 

Wie @JonathanLisic Noten, as.double nimmt nicht im Allgemeinen einen units Parameter, und dies wird für generische Zeitklassen nicht. Es ist die S3 Methode für difftime, die den Parameter übernimmt.

+0

Vielen Dank !! Es funktionierte. – Katherine

+1

Es ist wichtig zu beachten, dass diese Konvertierung nicht unbedingt für andere DateTimeClasses relevant ist. z.B. 'a1 <- strptime (" 2016-10-30 13:53:34 ", Format ="% Y-% m-% d% H:% M:% S "); as.double (a1, units = "days") gibt immer noch Sekunden aus der Epoche zurück. –

+1

@ JonathanLisic True, danke für den Zusatz. Der Grund dafür ist, dass 'wie.double' ist eine 'S3' Methode für' difftime'. –

0

@ MatthewLundberg Antwort ist richtig, aber ich werde eine Alternative vorschlagen nur die zugrundeliegenden Strukturen der zeitbasierten Objekte in R immer Zahlen veranschaulichen zu helfen, nur:

unclass(t1)/unclass(t3) 
# [1] 1.8 
# attr(,"units") 
# [1] "mins" 

Beachten Sie, dass im Hinblick auf die Einheiten, die Annäherung von t1/as.double(t3, units = 'secs') macht nicht viel Sinn, da die Einheiten der Ausgabe sind min/sec, während diese Antwort ist frei von Einheiten.

Hinweis weiter, dass dieser Ansatz ein bisschen gefährlich ist, da standardmäßig -.POSIXt (die schließlich aufgerufen wird, wenn Sie definieren t1, t2 und t3) automatisch wählt die Einheiten des Ausgangs (bei Kern, -.POSIXt hier wird Rufen Sie difftime mit dem Standardwert units = "auto"). In diesem Fall sind wir (vielleicht) das Glück, dass alle drei sind gegeben Einheiten, aber bedenken Sie t4:

t4 = as.POSIXct('2017-10-21 12:00:35') - as.POSIXct('2017-10-21 12:00:00') 
t4 
# Time difference of 35 secs 

Noch einmal, wenn wir t4 in einem Verhältnis zu verwenden, werden wir wahrscheinlich die falschen Einheiten erhalten.

Wir können dies vermeiden, indem ausdrücklich difftime Aufruf und erklärt die Geräte im Voraus:

t1 = difftime("2016-10-30 13:53:34", "2016-10-30 13:35:34", units = 'mins') 
t2 = difftime("2016-10-30 14:53:34", "2016-10-30 14:35:34", units = 'mins') 
t3 = difftime("2016-10-30 15:50:34", "2016-10-30 15:40:34", units = 'mins') 
t4 = difftime('2017-10-21 12:00:35', '2017-10-21 12:00:00', units = 'mins') 
t4 
# Time difference of 0.5833333 mins