2011-03-22 14 views
10

El comando diff devuelve las diferencias entre las fechas en un vector de fechas en el formato de fecha R. Me gustaría controlar las unidades que se devuelven, pero parece que se determinan automáticamente, sin forma de controlarlo con un argumento. He aquí un ejemplo:Establecer unidades de diferencia entre objetos datetime

> t = Sys.time() 
> diff(c(t, t + 1)) 
Time difference of 1 secs 

Y, sin embargo:

> diff(c(t, t+10000)) 
Time difference of 1.157407 days 

El objeto "delta de tiempo" tiene atribuyen a las unidades, pero parece tonto para escribir un montón de condicionales para obligar a todo en día, segundo, etc.

+1

Entonces, ¿cuál es su pregunta? ¿Qué quieres hacer realmente? Obtener diferencia en segundos entre dos objetos de fecha? Lo siento, pero no está claro para mí. – Andrie

+0

Me gustaría devolver unidades consistentes independientemente de la entrada, es decir, no importa qué delta esté entre dos fechas, diff siempre devuelve el delta en las mismas unidades, ya sean días, segundos o años. –

Respuesta

12

No estoy seguro de lo que quiere decir con "un montón de condicionales," acaba de cambiar las unidades manualmente.

> t = Sys.time() 
> a <- diff(c(t,t+1)) 
> b <- diff(c(t, t+10000)) 
> units(a) <- "mins" 
> units(b) <- "mins" 
> a 
Time difference of 0.01666667 mins 
> b 
Time difference of 166.6667 mins 

Ver ?difftime. Si solo necesita usar diff para obtener la diferencia entre dos veces (en lugar de un vector más largo), entonces, como sugiere Dirk, use la función difftime con el parámetro units.

+1

Gracias - No me di cuenta de que puedo cambiar las unidades de esa manera --- Pensé que tendría que hacer algo como if (diff (t) $ units == "sec") ... –

9

Un tipo POSIXct (que ha creado al llamar al Sys.time()) siempre usa fracciones de segundo desde la época.

La difftime() funciones meramente formatea de forma diferente para su placer de lectura. Si en realidad se especifica el formato, se obtiene lo que se especifica:

R> difftime(t+ 10000,t,unit="secs") 
Time difference of 10000 secs 
R> difftime(t+ 10000,t,unit="days") 
Time difference of 0.115741 days 
R> 
6

Creo que necesita difftime en el que puede especificar las unidades deseadas. Ver:

> difftime(Sys.time(), Sys.time()+10000) 
Time difference of -2.777778 hours 

> difftime(Sys.time(), Sys.time()+10000, units="secs") 
Time difference of -10000 secs 
1

No sabe cómo precisa es que quiere ser, pero puede ser muy específico acerca de dátiles veces con el paquete lubridate. Una cosa poco clara sobre las unidades de tiempo es que su longitud depende de cuándo ocurren debido a los segundos intercalares, los días bisiestos y otras convenciones.

Después de cargar lubridate, restar las fechas crea automáticamente un objeto de intervalo de tiempo.

library(lubridate) 
int <- Sys.time() - (Sys.time() + 10000) 

Puede cambiarlo a una duración que mida el tiempo exacto. Las duraciones se muestran en segundos porque los segundos son la única unidad que tiene una longitud constante. Si quiere su respuesta en una unidad específica, solo divida por un objeto de duración que tenga la longitud de una de esas unidades.

as.duration(int) 
int/dseconds(1) 
int/ddays(1) 
int/dminutes(5) #to use "5 minutes" as a unit 

O simplemente podría cambiar el int a un punto. A diferencia de las duraciones, los períodos no tienen una longitud exacta y constante. Pero ellos fielmente trazan los tiempos del reloj. Puede hacer operaciones matemáticas agregando y restando períodos y duraciones a tiempos de fecha.

as.period(int) 
Sys.time() + dseconds(5) + dhours(2) - ddays(1) 
Sys.time() + hours(2) + months(5) - weeks(1) #these are periods 
1

Si Yon necesidad de utilizar la función diff() (por ejemplo, como lo hago en dentro de una función ddply), también puede convertir los datos de entrada en formato numérico para recibir siempre las diferencias en cuestión de segundos como esto:

> t = Sys.time() 
> diff(as.numeric(c(t, t+1))) 
[1] 1 
> diff(as.numeric(c(t, t+10000))) 
[1] 10000 

A partir de ese punto, puede usar los segundos del diferencial para calcular las diferencias en otras unidades.

Cuestiones relacionadas