Zeit aus POSIXct extrahieren

81

Wie würde ich die Zeit aus einer Reihe von POSIXct-Objekten extrahieren, die den Datumsteil verwerfen?

Zum Beispiel habe ich:

times <- structure(c(1331086009.50098, 1331091427.42461, 1331252565.99979, 
1331252675.81601, 1331262597.72474, 1331262641.11786, 1331269557.4059, 
1331278779.26727, 1331448476.96126, 1331452596.13806), class = c("POSIXct", 
"POSIXt"))

was diesen Daten entspricht:

"2012-03-07 03:06:49 CET" "2012-03-07 04:37:07 CET" 
"2012-03-09 01:22:45 CET" "2012-03-09 01:24:35 CET" 
"2012-03-09 04:09:57 CET" "2012-03-09 04:10:41 CET"
"2012-03-09 06:05:57 CET" "2012-03-09 08:39:39 CET"
"2012-03-11 07:47:56 CET" "2012-03-11 08:56:36 CET"

Jetzt habe ich einige Werte für einen zu diesen Zeiten gemessenen Parameter

val <- c(1.25343125e-05, 0.00022890575, 
         3.9269125e-05, 0.0002285681875, 
         4.26353125e-05, 5.982625e-05, 
         2.09575e-05, 0.0001516951251, 
         2.653125e-05, 0.0001021391875)

Ich möchte val gegen die Tageszeit zeichnen, unabhängig von dem spezifischen Tag, an dem val gemessen wurde.

Gibt es eine bestimmte Funktion, mit der ich das tun kann?

nico
quelle

Antworten:

114

Sie können strftimeDatumsangaben in ein beliebiges Zeichenformat konvertieren:

> t <- strftime(times, format="%H:%M:%S")
> t
 [1] "02:06:49" "03:37:07" "00:22:45" "00:24:35" "03:09:57" "03:10:41"
 [7] "05:05:57" "07:39:39" "06:47:56" "07:56:36"

Das hilft aber nicht viel, da Sie Ihre Daten zeichnen möchten. Eine Problemumgehung besteht darin, das Datumselement aus Ihrer Uhrzeit zu entfernen und dann allen Ihren Uhrzeiten ein identisches Datum hinzuzufügen:

> xx <- as.POSIXct(t, format="%H:%M:%S")
> xx
 [1] "2012-03-23 02:06:49 GMT" "2012-03-23 03:37:07 GMT"
 [3] "2012-03-23 00:22:45 GMT" "2012-03-23 00:24:35 GMT"
 [5] "2012-03-23 03:09:57 GMT" "2012-03-23 03:10:41 GMT"
 [7] "2012-03-23 05:05:57 GMT" "2012-03-23 07:39:39 GMT"
 [9] "2012-03-23 06:47:56 GMT" "2012-03-23 07:56:36 GMT"

Jetzt können Sie diese datetimeObjekte in Ihrem Plot verwenden:

plot(xx, rnorm(length(xx)), xlab="Time", ylab="Random value")

Geben Sie hier die Bildbeschreibung ein


Weitere Hilfe finden Sie unter ?DateTimeClasses

Andrie
quelle
15

Es gab frühere Antworten, die den Trick zeigten. Im Wesentlichen:

  • Sie müssen POSIXctTypen beibehalten , um alle vorhandenen Plotfunktionen nutzen zu können

  • Wenn Sie mehrere Tage auf einem einzelnen Plot "überlagern" möchten, um die Variation innerhalb des Tages hervorzuheben, ist der beste Trick auch ...

  • den gleichen Tag auferlegen (und gegebenenfalls Monat und sogar Jahr, was hier nicht der Fall ist)

Dies können Sie tun, indem Sie die Komponenten "Tag des Monats" und "Monat" in der POSIXltDarstellung überschreiben oder indem Sie das "Delta" relativ zu 0:00:00 zwischen den verschiedenen Tagen verschieben.

Also mit timesund valwie von Ihnen hilfreich bereitgestellt:

## impose month and day based on first obs
ntimes <- as.POSIXlt(times)    # convert to 'POSIX list type'
ntimes$mday <- ntimes[1]$mday  # and $mon if it differs too
ntimes <- as.POSIXct(ntimes)   # convert back

par(mfrow=c(2,1))
plot(times,val)   # old times
plot(ntimes,val)  # new times

ergibt dies im Gegensatz zu den ursprünglichen und modifizierten Zeitskalen:

Geben Sie hier die Bildbeschreibung ein

Dirk Eddelbuettel
quelle
9

Das data.tablePaket hat eine Funktion ' as.ITime', die dies effizient nutzen kann:

library(data.table)
x <- "2012-03-07 03:06:49 CET"
as.IDate(x) # Output is "2012-03-07"
as.ITime(x) # Output is "03:06:49"
JegarP
quelle
4

Ich kann nichts finden, das sich genau mit Uhrzeiten befasst, daher würde ich nur einige Funktionen aus dem Paket verwenden: schmieren und mit Sekunden seit Mitternacht arbeiten:

require(lubridate)
clockS = function(t){hour(t)*3600+minute(t)*60+second(t)}
plot(clockS(times),val)

Vielleicht möchten Sie sich dann einen Teil des Achsencodes ansehen, um herauszufinden, wie Achsen gut beschriftet werden.

Spacedman
quelle
Schön, muss ich mir ansehen lubridate, scheint ein interessantes Paket zu sein.
Nico
4

Es wurden viele Lösungen bereitgestellt, aber ich habe diese nicht gesehen, die das Paket chron verwendet:

hours = times(strftime(times, format="%T"))
plot(val~hours)

(Entschuldigung, ich bin nicht berechtigt, ein Bild zu posten. Sie müssen es selbst zeichnen.)

Denis Chabot
quelle
3

Der time_tWert für Mitternacht GMT ist immer durch 86400( 24 * 3600) teilbar . Der Wert für Sekunden seit Mitternacht GMT ist somit time %% 86400.

Die Stunde in GMT ist (time %% 86400) / 3600und dies kann als x-Achse des Diagramms verwendet werden:

plot((as.numeric(times) %% 86400)/3600, val)

Geben Sie hier die Bildbeschreibung ein

Um eine Zeitzone anzupassen, passen Sie die Zeit vor der Aufnahme des Moduls an, indem Sie die Anzahl der Sekunden hinzufügen, die Ihre Zeitzone vor GMT liegt. Beispielsweise liegt die zentrale Sommerzeit (CDT) in den USA 5 Stunden hinter GMT. Um gegen die Zeit in CDT zu zeichnen, wird der folgende Ausdruck verwendet:

plot(((as.numeric(times) - 5*3600) %% 86400)/3600, val)
Matthew Lundberg
quelle