it-swarm.com.de

Datumsumrechnung von POSIXct nach Date in R

kann mir jemand sagen, warum R ein solches Ergebnis liefert?

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

Sollte es nicht 2013-01-01 Sein, nachdem POSIXct in Date für 2013-01-01 07:00 Konvertiert wurde, gibt es eine Möglichkeit, den Grenzwert von 08:00 In zu ändern 00:00?

Update Nr. 1

Ich habe festgestellt, dass das Folgende mein Problem beheben kann, aber auf eine weniger ordentliche Weise

> as.Date(as.character(as.POSIXct("2013-01-01 07:00")))
[1] "2013-01-01"
30
lokheart

Das Problem hier sind die Zeitzonen - Sie können sehen, dass Sie sich in "HKT" Befinden. Versuchen:

as.Date(as.POSIXct("2013-01-01 07:00", 'GMT'))
[1] "2013-01-01"

Von ?as.Date():

["POSIXct" wird in Tage umgewandelt, indem die Zeit nach Mitternacht in der Darstellung der Zeit in der angegebenen Zeitzone, Standard-UTC, ignoriert wird

34
alexwhan

Verwenden Sie den Zeitzonenparameter von 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"

Tatsächlich empfehle ich, immer den Parameter tz zu verwenden, wenn Sie Funktionen zur Konvertierung von Datum und Uhrzeit verwenden. Es gibt andere böse Überraschungen, z. mit Sommerzeit.

23
Roland

Dies geschieht dokumentiert und zuvor erläutert, wenn die UTC-Zeit vor (Ihr drittes Beispiel) oder nach Mitternacht an Ihrem POSIXct-Datum liegt. Sehen Sie sich 'as.Date.POSIXct' an der Konsole an, um sich selbst ein Bild von der Mathematik zu machen. Die Mathematik unter der Standardeinstellung tz = "UTC" ist klar. In dem nicht standardmäßigen Fall ruft R im Wesentlichen as.Date.POSIXlt auf, und die "Datumsverschiebung" tritt nicht auf. Wenn Sie mit dem "lt" -Objekt begonnen hätten, hätten Sie dieses Problem nicht gehabt:

as.Date (as.POSIXlt ("2013-01-01 07:00", tz = "Hongkong"))
[1] 2013-01-01

Die einfachste Lösung besteht darin, as.Date mit tz = "" aufzurufen, um die Verwendung des weniger problematischen as.Date.POSIXlt-Algorithmus zu erzwingen:

as.Date (as.POSIXct ("2013-01-01 07:00"), tz = "")
[1] 2013-01-01

1
Dan Murphy