Wie konvertiert man Daten / Zeiten von einer Zeitzone in eine andere in R?

Wenn ich ein solches Datum in London habe: “2009-06-03 19:30”, wie kann ich es in die entsprechende Zeit an der Westküste der USA umwandeln?

Ändern Sie das TZone-Attribut eines ‘POSIXct’-Objekts:

> pb.txt < - "2009-06-03 19:30" > pb.date < - as.POSIXct(pb.txt, tz="Europe/London") > attributes(pb.date)$tzone < - "America/Los_Angeles" > pb.date [1] "2009-06-03 11:30:00 PDT" 

Beachten Sie, dass dies immer noch ein POSIXct-Objekt ist, tzone geändert wurde und der korrekte Offset angewendet wurde:

 > attributes(pb.date) $class [1] "POSIXct" "POSIXt" $tzone [1] "America/Los_Angeles" 

Paket lubridate enthält zwei functionen zum Konvertieren von Zeitzonen. Laut den Hilfeseiten:

force_tz gibt ein Datum und eine Uhrzeit zurück, die dieselbe Uhrzeit wie x in der neuen Zeitzone haben.

 force_tz(time, tzone = "America/Los_Angeles") 

with_tz ändert die Zeitzone, in der ein Moment angezeigt wird. Die für den Augenblick angezeigte Uhrzeit ändert sich, aber der beschriebene Zeitpunkt bleibt gleich.

 with_tz(time, tzone = "America/Los_Angeles") 

Konvertieren Sie zunächst die Londoner Zeit in ein POSIXct Objekt:

 pb.txt < - "2009-06-03 19:30" pb.date <- as.POSIXct(pb.txt, tz="Europe/London") 

Verwenden Sie dann das format , um das Datum in einer anderen Zeitzone zu drucken:

 > format(pb.date, tz="America/Los_Angeles",usetz=TRUE) [1] "2009-06-03 11:30:00 PDT" 

Es gibt einige Tricks, um den richtigen zu verwendenden Zeitzonenbezeichner zu finden. Mehr Details in diesem Beitrag im Revolutions Blog: Konvertieren von Zeitzonen in R: Tipps, Tricks und Fallstricke

Wenn Sie dies in einer Zeile machen POSIXct , erinnern Sie sich daran, dass jedes POSIXct Objekt in R wirklich nur eine Zahl ist (Sekunden UTC seit Beginn der Epoche) und dass die “Zeitzone” nur ein Attribut ist, das bestimmt, wie diese Zahl gedruckt wird .

Daher können wir structure wie folgt verwenden:

 x = as.POSIXct("2009-06-03 19:30", tz = "Europe/London") structure(as.integer(x), class = class(x), tzone = 'America/Los_Angeles') # [1] "2009-06-03 11:30:00 PDT" 

as.integer die class und die Attribute von x , und die structure ermöglicht es uns, diese zu as.integer und anzupassen. class(x) ist eine Abkürzung für c('POSIXct', 'POSIXt') ; Wenn Ihr Objekt Millisekunden aufweist und Sie diese verfolgen as.numeric(x) , können Sie as.numeric(x) .