web-dev-qa-db-fra.com

Conversion de date de POSIXct en Date en R

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?

Mise à jour # 1

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

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

34
alexwhan

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é.

23
Roland

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"

1
Dan Murphy