web-dev-qa-db-ja.com

POSIXctからRの日付への日付変換

rがそのような結果を下に与える理由を誰にも教えてもらえますか?

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

2013-01-01POSIXctDateに変換した後、2013-01-01 07:00であってはなりません。カットオフを08:00から00:00に変更する方法はありますか?

アップデート#1

私は次のことが私の問題を解決できることを発見しましたが、あまりきちんとした方法ではありません

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

ここでの問題はタイムゾーンです-_"HKT"_にいることがわかります。試してください:

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

?as.Date()から:

["POSIXct"は、指定されたタイムゾーンの時刻の表現で、真夜中以降の時刻を無視することにより、デフォルトのUTCに変換されます。

34
alexwhan

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"

実際、日時変換関数を使用するときは、常にtzパラメーターを使用することをお勧めします。他にも厄介な驚きがあります。夏時間。

23
Roland

これは、同時UTC時間がPOSIXct日付の午前0時より前(3番目の例)または午前0時以降に文書化され、以前に説明されたとおりに発生します。自分で数学を見るには、コンソールで「as.Date.POSIXct」を調べてください。デフォルトのtz = "UTC"の下の数学は明確です。デフォルト以外の場合、Rは基本的にas.Date.POSIXltを呼び出し、「date-travel」は発生しません。実際、「lt」オブジェクトで開始した場合、この問題は発生しませんでした。

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

最も簡単な回避策は、tz = ""でas.Dateを呼び出して、問題の少ないas.Date.POSIXltアルゴリズムを強制的に使用することです。

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

1
Dan Murphy