Come si convertono date / orari da un fuso orario a un altro in R?

Se ho una data come questa a Londra: “2009-06-03 19:30”, come posso convertirlo nel tempo equivalente nella costa occidentale degli Stati Uniti?

Cambia l’attributo tzone di un object POSIXct:

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

Si noti che questo è ancora un object POSIXct, il valore di tzone è cambiato e l’offset corretto è stato applicato:

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

Il pacchetto lubridate contiene due funzioni per convertire i fusi orari. Secondo le pagine di aiuto:

force_tz restituisce una data-ora con lo stesso orario di x nel nuovo fuso orario.

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

with_tz cambia il fuso orario in cui viene visualizzato un istante. L’ora visualizzata per le modifiche istantanee, ma il momento descritto rimane lo stesso.

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

Innanzitutto, converti l’ora di Londra in un object POSIXct :

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

Quindi utilizzare il format per stampare la data in un altro fuso orario:

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

Ci sono alcuni trucchi per trovare l'identificatore del fuso orario giusto da usare. Maggiori dettagli in questo post nel blog di Revolutions: Conversione dei fusi orari in R: suggerimenti, trucchi e insidie

Se vuoi farlo in una riga, ricorda che qualsiasi object POSIXct in R è in realtà solo un numero (secondi UTC da inizio epoca), e che il “fuso orario” è solo un attributo che determina come viene stampato quel numero.

Pertanto, possiamo usare la structure come segue:

 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 la class e gli attributi di x e la structure ci consente di ricostruirli / personalizzarli. class(x) è una scorciatoia per c('POSIXct', 'POSIXt') ; se il tuo object ha millisecondi e ti piacerebbe tenerne traccia, puoi usare as.numeric(x) .