0

POSIXct オブジェクトのベクトルがあります。

> dates <- seq(as.POSIXct("2004-01-01", tz="EST"), as.POSIXct("2004-01-02", tz="EST"), as.difftime(6, units="hours"))
> dates
[1] "2004-01-01 00:00:00 EST" "2004-01-01 06:00:00 EST"
[3] "2004-01-01 12:00:00 EST" "2004-01-01 18:00:00 EST"
[5] "2004-01-02 00:00:00 EST"

UNIX エポックepochの POSIXct オブジェクトを定義する変数を作成します。

> epoch <- strptime("1970-01-01 00:00:00", "%Y-%m-%d %H:%M:%S", tz="EST")
> class(epoch)
[1] "POSIXct" "POSIXt"  
> epoch
[1] "1970-01-01 EST"

次に、datesベクトルをループして値を出力します。オフセットは次のepochとおりです。

> for (d in dates) { print(as.POSIXct(d, origin=epoch, tz="EST")) }
[1] "2004-01-01 05:00:00 EST"
[1] "2004-01-01 11:00:00 EST"
[1] "2004-01-01 17:00:00 EST"
[1] "2004-01-01 23:00:00 EST"
[1] "2004-01-02 05:00:00 EST"

datesの値とそれらの同じ値の表現の間には、 に対して 5 時間のオフセット エラーがあるようepochです。

ESTとUTCは+5時間の差がありますがepochtzオプションでESTのタイムゾーンを指定しました。を印刷するepochと、時刻情報はなく、日付のみのようです。

または にバグがありますstrptimeas.POSIXct、それともオフセットを計算しているか、epoch間違って生成していますか?

4

1 に答える 1

1

Forループスタイルの回答で述べたように、クラスの強制に影響がありますか?forループでは、日付が数値に変換されます。これは、「標準」エポックからの秒数です。これには、ESTとUTCの間の5時間のシフトが含まれます。それはあなたのへのオフセットとして追加されますepoch。のソースを参照してくださいas.POSIXct.numeric

以下は、数値に変換したときに正しい秒数になる日付を設定するため、機能します。

dates <- seq(as.POSIXct("2004-01-01", tz="UTC"), 
             as.POSIXct("2004-01-02", tz="UTC"), 
             as.difftime(6, units="hours"))
epoch <- strptime("1970-01-01 00:00:00", "%Y-%m-%d %H:%M:%S", tz="EST")

for (d in dates) { print(as.POSIXct(d, origin=epoch, tz="EST")) }

これは

[1] "2004-01-01 EST"
[1] "2004-01-01 06:00:00 EST"
[1] "2004-01-01 12:00:00 EST"
[1] "2004-01-01 18:00:00 EST"
[1] "2004-01-02 EST"
于 2012-01-06T00:22:53.417 に答える