Tratar con períodos de tiempo, tales como 5 minutos y 30 segundos en R
Pregunta
¿Hay una buena manera de hacer frente a períodos de tiempo como 5:30 (5 minutos, 30 segundos) en R?
Como alternativa ¿cuál es la manera más rápida para convertirlo en un entero con apenas unos segundos?
Sólo puede convertir a las fechas y realmente no puede encontrar un tipo de datos de tiempo.
Estoy usando R con zoológico.
Muchas gracias!
segundos fue la mejor manera de lidiar con esto. Adapté código de Shane abajo para mis propósitos, aquí está el resultado.
# time - time in the format of dd hh:mm:ss
# (That's the format used in cvs export from Alcatel CCS reports)
#
time.to.seconds <- function(time) {
t <- strsplit(as.character(time), " |:")[[1]]
seconds <- NaN
if (length(t) == 1 )
seconds <- as.numeric(t[1])
else if (length(t) == 2)
seconds <- as.numeric(t[1]) * 60 + as.numeric(t[2])
else if (length(t) == 3)
seconds <- (as.numeric(t[1]) * 60 * 60
+ as.numeric(t[2]) * 60 + as.numeric(t[3]))
else if (length(t) == 4)
seconds <- (as.numeric(t[1]) * 24 * 60 * 60 +
as.numeric(t[2]) * 60 * 60 + as.numeric(t[3]) * 60 +
as.numeric(t[4]))
return(seconds)
}
Solución
Como Dirk señala, hay un objeto llamado "difftime", pero no se puede añadir / resta.
> as.difftime(5, units="mins")
Time difference of 5 mins
> d <- seq(from=as.POSIXct("2003-01-01"), to=as.POSIXct("2003-01-04"), by="days")
> d
[1] "2003-01-01 GMT" "2003-01-02 GMT" "2003-01-03 GMT" "2003-01-04 GMT"
> d + as.difftime(5, units="mins")
[1] "2003-01-01 00:00:05 GMT" "2003-01-02 00:00:05 GMT"
[3] "2003-01-03 00:00:05 GMT" "2003-01-04 00:00:05 GMT"
Warning message:
Incompatible methods ("+.POSIXt", "Ops.difftime") for "+"
Parece que ahora puede hacer esto:
> as.difftime(5, units='mins')
Time difference of 5 mins
> d <- seq(from=as.POSIXct("2003-01-01"), to=as.POSIXct("2003-01-04"), by="days")
> d
[1] "2003-01-01 GMT" "2003-01-02 GMT" "2003-01-03 GMT" "2003-01-04 GMT"
> d + as.difftime(5, unit='mins')
[1] "2003-01-01 00:05:00 GMT" "2003-01-02 00:05:00 GMT"
[3] "2003-01-03 00:05:00 GMT" "2003-01-04 00:05:00 GMT"
> d + as.difftime(5, unit='secs')
[1] "2003-01-01 00:00:05 GMT" "2003-01-02 00:00:05 GMT"
[3] "2003-01-03 00:00:05 GMT" "2003-01-04 00:00:05 GMT"
>
Esto es con el recientemente publicado R 2.15.0
Otros consejos
Sí, mientras que no hay 'tiempo' de tipo, se puede utilizar un desplazamiento de tiempo:
R> now <- Sys.time()
R> now
[1] "2009-09-07 08:40:32 CDT"
R> class(now)
[1] "POSIXt" "POSIXct"
R> later <- now + 5*60
R> later
[1] "2009-09-07 08:45:32 CDT"
R> class(later)
[1] "POSIXt" "POSIXct"
R> tdelta <- difftime(later, now)
R> tdelta
Time difference of 5 mins
R> class(tdelta)
[1] "difftime"
R>
Cuando se utiliza la href="http://cran.r-project.org/package=zoo" rel="noreferrer"> zoológico , usted está utilizando tipos POSIXt
estándar para sus índices veces. Tanto el zoológico y el XTS paquete más reciente y también muy recomendable- puede utilizar POSIXt
, y especialmente el tipo POSIXct
compacta, para la indexación.
El paquete XTS tiene una funcionalidad mucho más la indexación, y Jeff añadido recientemente el análisis de los intervalos de acuerdo con la especificación ISO8601-2004 (e) y da estas referencias para ISO8601 y un Preguntas más frecuentes sobre estándares ampliamente utilizados para los formatos de fecha y hora . Para utilizar esta versión XTS, puede que tenga que cambiar el XTS instantánea desarrollo de r-forja
[ Editar: ] Asimismo, con respecto a la cuestión de la 'conversión': esto es fácil una vez que tenga los objetos
de clase POSIXt / POSIXct como as.numeric()
convertirá POSIXct a segundos (fraccionarios) desde la época. R va más allá del estándar POSIX y utiliza un doble aquí, para que pueda obtener una precisión de milisegundos:
R> options("digits.secs"=6) ## needed so that fractional seconds are printed
R> now <- Sys.time(); difftime(Sys.time(), now)
Time difference of 0.000149 secs
y
R> print(as.numeric(now), digits=15) ## print with digits for sub-second time
[1] 1252374404.22975
R>