2012-02-21 81 views
7

Tengo un problema al restar dos columnas de una tabla que consta de fecha y hora en una sola celda.Restar dos columnas que constan de fecha y hora en R

> TimeData 

DEPARTURE_TIME  LAB_TIME 
1/30/2010 4:18  1/30/2010 0:29 
1/30/2010 4:18  1/30/2010 0:29 
1/30/2010 6:49  1/30/2010 0:48 
1/30/2010 6:49  1/30/2010 0:48 
1/30/2010 9:42  1/30/2010 1:29 
1/30/2010 9:42  1/30/2010 1:29 
1/30/2010 7:25  1/30/2010 1:16 

Necesito obtener la diferencia entre el tiempo de salida y el tiempo de laboratorio en horas y minutos.

¿Debo separar la hora y la fecha o hay alguna manera de restar los datos de esta manera?

Realmente agradezco cualquier ayuda.

+0

¿Son estas columnas cadenas o fechas (en I)? –

Respuesta

12

Probar TimeData$DEPARTURE_TIME - TimeData$LAB_TIME?

Depende de si sus columnas xxx_TIME son cadenas o si las ha convertido a fecha-hora.

Supongamos que son cadenas (se han leído usando read.csv o algo similar); a continuación, convertirlos a fecha-hora objetos que se pueden utilizar as.POSIXct (ver ?as.POSIXct y strptime):

# convert the string columns to dates 
TimeData$DEPARTURE_TIME <- as.POSIXct(TimeData$DEPARTURE_TIME, 
             format='%m/%d/%Y %H:%M') 
TimeData$LAB_TIME  <- as.POSIXct(TimeData$LAB_TIME, 
             format='%m/%d/%Y %H:%M') 

nota del argumento format: parece que los suyos son en mes/día horas/año: minutos (25 de reloj h) formato. Consulte ?strptime para obtener más información sobre los formatos de fecha.

entonces para calcular la diferencia, se puede hacer ya sea:

diffs <- TimeData$DEPARTURE_TIME - TimeData$LAB_TIME 

que recoge las unidades de tiempo apropiados para usted, o para especificar las horas que puede utilizar difftime (ver ?difftime):

# like saying DEPARTURE_TIME-LAB_TIME but more control over the output 
diffs <- difftime(TimeData$DEPARTURE_TIME,TimeData$LAB_TIME,units="hours") 

El objeto resultante diffs se ve así:

> diffs 
Time differences in hours 
[1] 3.816667 3.816667 6.016667 6.016667 8.216667 8.216667 6.150000 
attr(,"tzone") 
[1] "" 

Para extraer solo la parte numérica, use as.numeric(diffs). convertir esto en un vector de horas y un vector minutos ... bueno, 60 minutos a una segunda, etc:

# use as.numeric(diffs) to retrieve just the vector. 
# let's convert to hours & minutes... 
diffs.hours <- floor(as.numeric(diffs)) 
diffs.minutes <- (as.numeric(diffs)%%1 * 60) 

dándole:

> diffs.hours 
[1] 3 3 6 6 8 8 6 
> diffs.minutes 
[1] 49 49 1 1 13 13 9 
Cuestiones relacionadas