13

yearmonの日付 ( zooパッケージから) を UTC タイムゾーンの POSIXct に変換しようとしています。これは私がやろうとしたことです:

> as.POSIXct(as.yearmon("2010-01-01"), tz="UTC")
[1] "2010-01-01 01:00:00 CET"

日付を変換すると同じ結果が得られます。

> as.POSIXct(as.Date("2010-01-01"),tz="UTC")
[1] "2010-01-01 01:00:00 CET"

それを機能させる唯一の方法は、文字を引数として渡すことです。

> as.POSIXct("2010-01-01", tz="UTC")
[1] "2010-01-01 UTC"

DateTimeClassestzset、およびtimezonesのドキュメントを調べました。私の /etc/localtime はヨーロッパ/アムステルダムに設定されています。TZ 環境変数を設定する以外に、tz を UTC に設定する方法が見つかりませんでした。

> Sys.setenv(TZ="UTC")
> as.POSIXct(as.Date("2010-01-01"),tz="UTC")
[1] "2010-01-01 UTC"

yearmon または Date から POSIXct を作成するときにタイムゾーンを直接設定することは可能ですか?

編集:

関数は .POSIXct.yearmon として確認しました。これは as.POSIXct.Date に渡されます。

> zoo:::as.POSIXct.yearmon
function (x, tz = "", ...) 
as.POSIXct(as.Date(x), tz = tz, ...)
<environment: namespace:zoo>

ジョシュアが言うように、タイムゾーンは as.POSIXct.Date で失われます。今のところ、リッチーの提案を使用して、次を使用して手動で tzone を設定します。

attr(x, "tzone") <- 'UTC'

これは、Grothendieck と Dwin が提案したように内部ではなく、プレゼンテーションにのみ使用される失われた tzone の問題を解決します。

4

4 に答える 4

7

これは、に渡されas.POSIXct.Dateないためです。....POSIXct

> as.POSIXct.Date
function (x, ...) 
.POSIXct(unclass(x) * 86400)
<environment: namespace:base>
于 2011-07-01T13:45:36.400 に答える
5

コードでタイムゾーンを正しく設定していますあなたが認識している問題は、出力段階だけにあります。POSIX 値はすべて UTC/GMT を基準にしています。日付は午前 0 時と見なされます。真夜中の UTC1 AM CET です (明らかにあなたがいる場所です)。

> as.POSIXct(as.yearmon("2010-01-01"), tz="UTC")
[1] "2009-12-31 19:00:00 EST"     # R reports the time in my locale's timezone
> dtval <- as.POSIXct(as.yearmon("2010-01-01"), tz="UTC")
> format(dtval, tz="UTC")         # report the date in UTC  note it is the correct date ... there
[1] "2010-01-01"
> format(dtval, tz="UTC", format="%Y-%m-%d ")
[1] "2010-01-01 "                 # use a format string
> format(dtval, tz="UTC", format="%Y-%m-%d %OS3")
[1] "2010-01-01 00.000"           # use decimal time

?strptime他の非常に多くのフォーマットの可能性を参照してください。

于 2011-07-01T13:57:52.880 に答える
3

"POSIXct"これは、日付/時刻クラスのメソッドでは奇妙に思えます。"Date"or"yearmon"変数を最初にフォーマットして、as.POSIXct.characterむしろas.POSIXct.{Date, yearmon}がディスパッチされるようにしてください。

日にち

> d <- as.Date("2010-01-01")
> as.POSIXct(format(d), tz = "UTC")
[1] "2010-01-01 UTC"

年門

> library(zoo)
> y <- as.yearmon("2010-01")
> as.POSIXct(format(y, format = "%Y-%m-01"), tz = "UTC")
[1] "2010-01-01 UTC"
> # or
> as.POSIXct(format(as.Date(y)), tz = "UTC")
[1] "2010-01-01 UTC"
于 2011-07-01T14:48:04.473 に答える
3

ヘルプページ?as.POSIXctでは、tz引数について

必要な場合は、変換に使用されるタイムゾーンの指定。システム固有 (タイム ゾーンを参照)。ただし、'""' は現在のタイムゾーンであり、'"GMT"' は UTC (協定世界時) です。

あなたas.POSIXct(as.yearmon("2010-01-01"), tz="GMT")のために働きますか?


ドキュメントをさらに熟読すると、詳細セクションに次のように表示されます。

時刻のない日付は、UTC の午前 0 時として扱われます。

したがって、あなたの例では、tz引数は無視されます。使用as.POSIXltすると、タイムゾーンで何が起こるかを簡単に確認できます。以下は、タイムゾーンとして UTC を使用して、すべて同じ答えを与えるはずです。

unclass(as.POSIXlt(as.yearmon("2010-01-01")))
unclass(as.POSIXlt(as.yearmon("2010-01-01"), tz = "UTC"))
unclass(as.POSIXlt(as.yearmon("2010-01-01"), tz = "GMT"))
unclass(as.POSIXlt(as.yearmon("2010-01-01"), tz = "CET"))

実際、as.yearmon(タイムアウトを取り除く)を使用しているため、タイムゾーンを設定することはできません。比較してください。

unclass(as.POSIXlt(as.yearmon("2010-01-01 12:00:00"), tz = "CET"))
unclass(as.POSIXlt("2010-01-01 12:00:00", tz = "CET"))
于 2011-07-01T13:34:40.967 に答える