Der Umgang mit Zeitperioden, wie beispielsweise 5 Minuten und 30 Sekunden in R

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

  •  21-09-2019
  •  | 
  •  

Frage

Gibt es eine gute Möglichkeit, mit Zeitperioden wie 5.30 (5 Minuten, 30 Sekunden) in R umgehen?

Alternativ, was ist der schnellste Weg, um es in eine ganze Zahl mit nur wenigen Sekunden zu konvertieren?

Ich kann nur für Daten konvertiert und kann nicht wirklich einen Datentyp für die Zeit finden.

Ich bin mit R mit Zoo.

Vielen Dank!


Sekunden war der beste Weg, damit umzugehen. Ich angepasst Shanes Code unten, um meine Zwecke, hier ist das Ergebnis.

# 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)
}
War es hilfreich?

Lösung

Wie Dirk weist darauf hin, gibt es ein Objekt namens „difftime“, aber es kann nicht hinzugefügt werden / subtrahiert.

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

Es scheint, können Sie dies jetzt tun:

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

Dies ist mit der kürzlich veröffentlichten R 2.15.0

Andere Tipps

Ja, während es keine ‚Zeit‘ ist der Typ, können Sie eine Offset-Zeit verwenden:

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> 

Wenn Sie die Verwendung Zoo Paket, sind Sie unter Verwendung von Standard POSIXt Typen für Ihre Zeiten Indizes. Sowohl Zoo und das neuere und auch besonders empfehlenswertes xts Paket verwenden kann POSIXt, und vor allem den kompakten POSIXct Typen, für die Indizierung.

Das XTS-Paket hat viel mehr Indizierung Funktionalität und Jeff kürzlich Parsen von Intervallen an die ISO8601-2004 (e) Spezifikation nach hinzugefügt und gibt diese Referenzen für ISO8601 und ein FAQ für weit verbreiteten standars für Datums- und Zeitformate . Um diese xts Version zu verwenden, müssen Sie möglicherweise die die xts Entwicklung Snapshot auf r-Schmiede wechseln

[ Edit: ] Auch in Bezug auf die Frage 'Bekehrung': Das ist einfach, wenn Sie Objekte haben der Klasse POSIXt / POSIXct als as.numeric() POSIXct bis (fraktionierten) Sekunden seit der Epoche konvertieren. R geht weiter als der POSIX-Standard und verwendet eine Doppel hier, so dass Sie Millisekunde Präzision erhalten:

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

und

R> print(as.numeric(now), digits=15)   ## print with digits for sub-second time
[1] 1252374404.22975
R> 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top