2009-09-07 8 views
3

Existe-t-il un bon moyen de gérer des périodes telles que 05:30 (5 minutes, 30 secondes) dans R?Traiter des plages horaires telles que 5 minutes et 30 secondes dans R

Sinon, quel est le moyen le plus rapide pour le convertir en entier avec quelques secondes?

Je peux seulement convertir en dates et ne peux pas vraiment trouver un type de données pour l'heure. J'utilise R avec zoo.

Merci beaucoup!


Secondes était le meilleur moyen de faire face à cela. J'ai adapté le code de Shane ci-dessous à mes fins, voici le résultat.

# 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) 
} 

Répondre

4

Comme le souligne Dirk dehors, il y a un objet appelé « difftime », mais ne peut pas être ajouté/soustrait.

> 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 "+" 

Semble vous pouvez le faire:

> 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" 
    > 

Ceci est la R 2.15.0

+2

a récemment publié Ouais, la faiblesse de difftime est un aspect vraiment triste des bibliothèques standard R . – Harlan

7

Oui, alors qu'il n'y a pas de type 'temps', vous pouvez utiliser un temps de décalage:

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> 

Lorsque vous utilisez le package zoo, vous utilisez POSIXt types standard pour vos indices fois. Le zoo ainsi que le paquet xts plus récent et hautement recommandé peuvent utiliser POSIXt, et en particulier le type compact POSIXct, pour l'indexation.

Le paquet XTS a beaucoup plus de fonctionnalités d'indexation et Jeff a récemment ajouté l'analyse syntaxique des intervalles selon la spécification ISO8601-2004 (e) et donne ces références pour ISO8601 et un FAQ for widely used standars for date and time formats. Pour utiliser cette XTS version, vous devrez peut-être changer le l'xts development snapshot on r-forge

[Edit:] En outre, en ce qui concerne la question sur la « conversion »: c'est facile une fois que vous avez des objets de classe POSIXt/POSIXct comme as.numeric() sera convertir POSIXct en secondes (fractionnaires) depuis l'époque. R va plus loin que la norme POSIX et utilise un double ici, vous bénéficiez d'une précision milliseconde:

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 

et

R> print(as.numeric(now), digits=15) ## print with digits for sub-second time 
[1] 1252374404.22975 
R> 
Questions connexes