Comment convertissez-vous les dates / heures d'un fuseau horaire à un autre dans R?

Si j'ai une date comme celle-ci à L'Heure de Londres: "2009-06-03 19: 30", Comment puis-je la convertir en heure équivalente sur la côte ouest des États-Unis?

24
r
demandé sur David Smith 2009-09-08 21:07:07

4 réponses

Change l'attribut tzone d'un objet '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"

Notez qu'il s'agit toujours D'un objet POSIXct, que tzone a changé et que le décalage correct a été appliqué:

> attributes(pb.date)
$class
[1] "POSIXct" "POSIXt" 

$tzone
[1] "America/Los_Angeles"
40
répondu Chris Holbrook 2012-09-07 19:42:19

Package lubridate contient deux fonctions pour convertir les fuseaux horaires. Selon les pages d'aide:


force_tz retourne une date-heure qui a la même heure que x dans le nouveau fuseau horaire.

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


with_tz modifie le fuseau horaire dans lequel un instant est affiché. L'heure d'horloge affichée pour l'instant change, mais le moment de temps décrit reste le même.

with_tz(time, tzone = "America/Los_Angeles")
22
répondu nnn 2014-02-13 11:39:52

Tout d'abord, convertissez L'Heure de Londres en un objet POSIXct:

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

, Puis utilisez format pour imprimer la date dans un autre fuseau horaire:

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

Il y a quelques astuces pour trouver le bon identifiant de fuseau horaire à utiliser. Plus de détails dans ce post sur le blog Revolutions: conversion des fuseaux horaires en R: Trucs, Astuces et pièges

14
répondu David Smith 2017-04-04 19:46:59

Si vous souhaitez le faire en une ligne, rappelez-vous que tout objet POSIXct dans R n'est vraiment qu'un nombre (secondes UTC depuis le début de l'époque), et que le "fuseau horaire" est juste un attribut qui détermine comment ce nombre est imprimé.

, par conséquent, nous pouvons utiliser structure comme suit:

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 les bandes de la classe et les attributs de x, et structure nous permet de reconstruire/personnaliser ces. {[6] } est un raccourci pour c('POSIXct', 'POSIXt'); Si votre objet a des millisecondes et que vous souhaitez garder une trace parmi eux, vous pouvez utiliser as.numeric(x).

0
répondu MichaelChirico 2018-05-10 10:32:00