Trattati i periodi di tempo come 5 minuti e 30 secondi a R
Domanda
C'è un buon modo per affrontare periodi di tempo, come 05:30 (5 minuti, 30 secondi) in R?
In alternativa qual è il modo più veloce per convertirlo in un intero con pochi secondi?
posso convertire solo per le date e non posso davvero trovare un tipo di dati per volta.
Sto usando R con zoo.
Grazie mille!
secondi era il modo migliore per affrontare questo. Ho adattato il codice di Shane qui sotto per i miei scopi, ecco il risultato.
# 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)
}
Soluzione
Come Dirk sottolinea, c'è un oggetto chiamato "difftime", ma non può essere aggiunto / sottratto.
> 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 "+"
Sembra ora si può fare questo:
> 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"
>
Questo è con la R recentemente rilasciato 2.15.0
Altri suggerimenti
Sì, mentre non v'è alcun tipo di 'tempo', è possibile utilizzare un tempo di offset:
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>
Quando si utilizza il zoo pacchetto , sei utilizzando tipi POSIXt
standard, per i tempi di indici. Sia zoo e il e anche altamente consigliato XTS pacchetto più recente può usare POSIXt
, e in particolare il tipo POSIXct
compatto, per l'indicizzazione.
Il pacchetto XTS ha molto più funzionalità di indicizzazione, e Jeff recentemente aggiunto l'analisi di intervalli secondo la (e) precisazione ISO8601-2004 e dà a questi riferimenti per ISO8601 ed un FAQ per standars ampiamente usato per i formati di data e ora . Per utilizzare questa XTS versione, potrebbe essere necessario cambiare l'istantanea dello sviluppo rel="noreferrer">
[ Modifica: ] Inoltre, per quanto riguarda la domanda sulla 'conversione': Questo è facile una volta che avete oggetti
di classe POSIXt / POSIXct come as.numeric()
convertirà POSIXct di secondi (frazionario) fin dall'epoca. R va oltre lo standard POSIX e utilizza un doppio qui, in modo da ottenere la precisione millisecondo:
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
e
R> print(as.numeric(now), digits=15) ## print with digits for sub-second time
[1] 1252374404.22975
R>