web-dev-qa-db-fra.com

Changer le fuseau horaire dans un objet POSIXct

Jouer avec dateTimes et timezone peut être délicat en R. Voici ma question: je veux changer le fuseau horaire sur un objet POSIXct

R) data <- data.frame(x=c(1,2),dateTime=as.POSIXct(c("2010-03-11 03:30:00.432","2010-03-15 03:30:00.432"),format="%Y-%m-%d %H:%M:%S",tz="America/Montreal"))
R) data
  x            dateTime
1 1 2010-03-11 03:30:00
2 2 2010-03-15 03:30:00
R) str(data)
'data.frame':   2 obs. of  2 variables:
 $ x       : num  1 2
 $ dateTime: POSIXct, format: "2010-03-11 03:30:00" "2010-03-15 03:30:00"

Mais si je veux changer le fuseau horaire, la seule chose que j'ai trouvée est:

R) data$dateTime2 = format(data$dateTime,tz="Europe/Paris")
R) str(data)
'data.frame':   2 obs. of  3 variables:
 $ x        : num  1 2
 $ dateTime : POSIXct, format: "2010-03-11 03:30:00" "2010-03-15 03:30:00"
 $ dateTime2: chr  "2010-03-11 09:30:00" "2010-03-15 08:30:00"

Ou

R) data$dateTime2 = as.POSIXlt(data$dateTime,tz="Europe/Paris")
R) str(data)
'data.frame':   2 obs. of  3 variables:
 $ x        : num  1 2
 $ dateTime : POSIXct, format: "2010-03-11 03:30:00" "2010-03-15 03:30:00"
 $ dateTime2: POSIXlt, format: "2010-03-11 09:30:00" "2010-03-15 08:30:00"

Dieu (ou quelqu'un sur SO) sait pourquoi cela ne fonctionne pas avec POSIXct

R) data$dateTime2 = as.POSIXct(data$dateTime,tz="Europe/Paris")
R) str(data)
'data.frame':   2 obs. of  3 variables:
 $ x        : num  1 2
 $ dateTime : POSIXct, format: "2010-03-11 03:30:00" "2010-03-15 03:30:00"
 $ dateTime2: POSIXct, format: "2010-03-11 03:30:00" "2010-03-15 03:30:00"

Dois-je convertir en character et reconvertir en POSIXct?

40
statquant

Cela ne fonctionne pas avec POSIXct car base::as.POSIXct.default renvoie simplement x si c'est déjà POSIXct. Vous pouvez modifier le fuseau horaire via l'attribut tzone:

attr(data$dateTime, "tzone") <- "Europe/Paris"
48
Joshua Ulrich

Dans le package lubridate, il y a une fonction with_tz qui modifie l'attribut de fuseau horaire (en fait ce que Joshua a décrit).

dttm <- as.POSIXct("2016-01-01 10:10:10", tz = "UTC")
dttm
[1] "2016-01-01 10:10:10 UTC"

Changer le fuseau horaire de UTC en CET

with_tz(dttm, "CET")
[1] "2016-01-01 11:10:10 CET"
22
Mark Heckmann