Calcolo della differenza di tempo tra due colonne
Domanda
Dopo aver convertito i fattori nel formato POSIXCT e quindi applicando il formato DateTime, voglio prendere la differenza di DateTime tra 2 POS1 e POS2.
Tuttavia, quando lo faccio per un elemento specifico ottengo la risposta giusta nella console, ma quando faccio l'operazione sull'intero set, la console emette solo il numero e anche la dataframe riflette tali numeri come puoi vedere.
.Come posso ottenere le ore nel dataframe quando sto cercando di fare la differenza? Sto usando il pacchetto Lubridate, c'è qualche funzione da fare?
Ecco alcuni ESEMPRE CODICE / Immagine dei dati in Rstudio che lo descrive
CR_Date <- data.frame(
pos1="2014-07-01 00:00:00",
pos2=c("2014-07-01 00:00:00","2014-07-01 10:15:00")
)
CR_Date[] <- lapply(CR_Date,as.POSIXct)
CR_Date
# pos1 pos2
#1 2014-07-01 2014-07-01 00:00:00
#2 2014-07-01 2014-07-01 10:15:00
CR_Date$pos2[2] - CR_Date$pos1[2]
#Time difference of 10.25 hours
CR_Date$hours <- CR_Date$pos2 - CR_Date$pos1
.
Soluzione
Prima cosa, questo non ha nulla a che fare con lubridato.
In secondo luogo, Rstudio ti ha deluso avvitando la stampa della variabile nella finestra del display.Se si inserisce CR_Date$hours
nella finestra della riga di comando vedrai stampe
#Time differences in secs
#[1] 0 36900
.
e head(CR_Date)
dà:
# pos1 pos2 hours
#1 2014-07-01 2014-07-01 00:00:00 0 secs
#2 2014-07-01 2014-07-01 10:15:00 36900 secs
.
uno dei quali ti avrebbe tirato fuori su cosa sta visualizzando.
Come suggerisce @Victorp, difftime
è il modo per risolvere questo:
CR_Date$hours <- with(CR_Date, difftime(pos2,pos1,units="hours") )
CR_Date
# pos1 pos2 hours
#1 2014-07-01 2014-07-01 00:00:00 0.00 hours
#2 2014-07-01 2014-07-01 10:15:00 10.25 hours
. Altri suggerimenti
È inoltre possibile utilizzare il "metodo as.double
" e il suo argomento units
(vedere ?diffime
):
.Metodo
as.double
[as.double(x, units = "auto", ...)
] Restituisce il valore numerico espresso nelle unità specificate
... dove x
è
.Un oggetto che eredita da classe
"difftime"
Applicato al tuo esempio, dove pos2 - pos1
comporterà un oggetto difftime
:
CR_Date$hours <- as.double(CR_Date$pos2 - CR_Date$pos1, units = "hours")
CR_Date
# pos1 pos2 hours
#1 2014-07-01 2014-07-01 00:00:00 0.00
#2 2014-07-01 2014-07-01 10:15:00 10.25
.
o altro units
:
as.double(CR_Date$pos2 - CR_Date$pos1, units = "mins")
#[1] 0 615
as.double(CR_Date$pos2 - CR_Date$pos1, units = "days")
#[1] 0.0000000 0.4270833
.