quelqu'un peut-il me dire pourquoi R donne un tel résultat ci-dessous:
> as.POSIXct("2013-01-01 08:00")
[1] "2013-01-01 08:00:00 HKT"
> as.Date(as.POSIXct("2013-01-01 08:00"))
[1] "2013-01-01"
> as.POSIXct("2013-01-01 07:00")
[1] "2013-01-01 07:00:00 HKT"
> as.Date(as.POSIXct("2013-01-01 07:00"))
[1] "2012-12-31"
Cela ne devrait-il pas être 2013-01-01
après la conversion de POSIXct
en Date
pour 2013-01-01 07:00
, existe-t-il un moyen de modifier le seuil de 08:00
à 00:00
?
J'ai trouvé que ce qui suit peut résoudre mon problème, mais de manière moins nette
> as.Date(as.character(as.POSIXct("2013-01-01 07:00")))
[1] "2013-01-01"
Le problème ici est les fuseaux horaires - vous pouvez voir que vous êtes dans "HKT"
. Essayer:
as.Date(as.POSIXct("2013-01-01 07:00", 'GMT'))
[1] "2013-01-01"
De ?as.Date()
:
["
POSIXct
" est] converti en jours en ignorant l'heure après minuit dans la représentation de l'heure dans le fuseau horaire spécifié, UTC par défaut
Utilisez le paramètre de fuseau horaire de as.Date
:
as.Date(as.POSIXct("2013-01-01 07:00",tz="Hongkong"))
#[1] "2012-12-31"
as.Date(as.POSIXct("2013-01-01 07:00",tz="Hongkong"),tz="Hongkong")
#[1] "2013-01-01"
En fait, je recommande de toujours utiliser le paramètre tz
lors de l'utilisation des fonctions de conversion date-heure. Il y a d'autres mauvaises surprises, par exemple avec l'heure d'été.
Cela se produit comme documenté et expliqué précédemment lorsque l'heure UTC contemporaine est antérieure (votre troisième exemple) ou après minuit à votre date POSIXct. Pour voir les mathématiques par vous-même, inspectez 'as.Date.POSIXct' sur la console. Le calcul sous le tz = "UTC" par défaut est clair. Dans le cas autre que par défaut, R appelle essentiellement as.Date.POSIXlt et le "date-travel" ne se produit pas. En fait, si vous aviez commencé avec l'objet "lt" vous n'auriez pas eu ce problème:
as.Date (as.POSIXlt ("2013-01-01 07:00", tz = "Hongkong"))
[1] "2013-01-01"
La solution la plus simple consiste à appeler as.Date avec tz = "" pour forcer l'utilisation de l'algorithme as.Date.POSIXlt le moins offensant:
as.Date (as.POSIXct ("2013-01-01 07:00"), tz = "")
[1] "2013-01-01"