Traitement des périodes de temps telles que 5 minutes et 30 secondes par R

StackOverflow https://stackoverflow.com/questions/1389428

  •  21-09-2019
  •  | 
  •  

Question

Y at-il une bonne façon de traiter avec des périodes de temps telles que 5h30 (5 minutes, 30 secondes) dans la R?

Sinon, quel est le meilleur moyen de le convertir en un entier en quelques secondes?

Je ne peux convertir les dates et ne peut pas vraiment trouver un type de données pour le temps.

J'utilise R avec zoo.

Merci beaucoup!


secondes était la meilleure façon de traiter cette question. J'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)
}
Était-ce utile?

La solution

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

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

On dirait que vous pouvez faire ceci:

  > 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 le récemment publié R 2.15.0

Autres conseils

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 Zoo forfait , vous êtes en utilisant des types standard POSIXt pour vos indices fois. Les deux zoo et le plus récent et aussi hautement recommandé package XTS peut utiliser POSIXt, et surtout le type de POSIXct compact, 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 de ISO8601 et FAQ pour standars largement utilisés pour les formats de date et d'heure . Pour utiliser cette XTS version, vous devrez peut-être changer le rel="noreferrer"> le

[ 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() convertira POSIXct à (fractionnaires) secondes depuis l'époque. R va plus loin que la norme POSIX et utilise un double ici, donc vous obtenez 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> 
scroll top