Hoe converteer je datums/tijden van de ene tijdzone naar de andere in R?

Als ik een datum als deze heb in Londense tijd: “2009-06-03 19:30”, hoe kan ik deze dan omzetten naar de equivalente tijd aan de westkust van de VS?


Antwoord 1, autoriteit 100%

Pakket lubridateheeft twee functies om tijdzones om te zetten. Volgens de helppagina’s:

force_tzretourneert een datum-tijd die dezelfde kloktijd heeft als xin de nieuwe tijdzone.

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

with_tzwijzigt de tijdzone waarin een moment wordt weergegeven. De weergegeven kloktijd voor het moment verandert, maar het beschreven tijdstip blijft hetzelfde.

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

Antwoord 2, autoriteit 98%

Gebruik attr()(base R) of lubridate::with_tz()(tidyverse) om hetzelfde moment in een andere tijdzone te bekijken.

De interne waarde van een POSIXct-object is altijd in UTC (aantal seconden sinds begin 1970; zie ?DateTimeClasses, maar de weergegeven tijd bij het afdrukken wordt bepaald door de tzoneattribuut. Verander dus het tzoneattribuut (via attr()of lubridate::with_tz()) om hetzelfde weer te geven/af te drukken moment in een andere tijdzone.

Bijvoorbeeld:

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

Opmerking tzone-attribuut bepaalt de tijdzone die wordt gebruikt wanneer deze wordt weergegeven/afgedrukt:

attributes(pb.date)$tzone
[1] "Europe/London"
pb.date
[1] "2009-06-03 19:30:00 BST"

Houd er rekening mee dat de interne waarde seconden is sinds de oorsprong in UTC, ongeacht het tzone-kenmerk:

as.numeric(pb.date)
[1] 1244053800

In basis R kan het tzone-attribuut worden ingesteld/gewijzigd met attr():

attr(pb.date, "tzone") <- "America/Los_Angeles"
pb.date  
[1] "2009-06-03 11:30:00 PDT"  

Equivalent, gebruik lubridate::with_tz()(die ook attrgebruikt):

pb.date <- lubridate::with_tz(pb.date, "America/Los_Angeles")

Houd er rekening mee dat de weergavetijd nu lokale kloktijd is in PDT:

pb.date  
[1] "2009-06-03 11:30:00 PDT"

maar interne waarde is niet veranderd:

as.numeric(pb.date)
[1] 1244053800

dus tzone heeft geen invloed op bewerkingen, alleen de weergegeven waarde wanneer deze wordt afgedrukt.


Antwoord 3, autoriteit 40%

Converteer eerst de Londense tijd naar een POSIXctobject:

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

Gebruik vervolgens formatom de datum in een andere tijdzone af te drukken:

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

Er zijn enkele trucs om de juiste tijdzone-ID te vinden die u wilt gebruiken. Meer details in dit bericht op het Revolutions-blog: Tijdzones converteren in R: tips , trucs en valkuilen


Antwoord 4, autoriteit 12%

Als u dit in één regel wilt doen, bedenk dan dat elk POSIXct-object in R in feite slechts een getal is (seconden UTC sinds het begin van het tijdperk), en dat de “tijdzone” slechts een attribuut dat bepaalt hoe dat nummer wordt afgedrukt.

Daarom kunnen we de .POSIXct-helperfunctie als volgt gebruiken:

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

as.integerverwijdert de klasse en attributen van x, en .POSIXctis een afkorting voor het construeren van een POSIXct-object; als uw object milliseconden heeft en u deze wilt bijhouden, kunt u as.numeric(x)gebruiken.

Other episodes