2012-01-05 87 views
0

我有POSIXct對象的矢量:爲什麼紀元日期是正確的,但不能用作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" 

我創建epoch變量用於定義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中的值與相對於epoch的那些相同值的表示之間的小時偏移誤差。

EST和UTC之間有+5小時的差異,但我指定了epoch的EST時區和tz選項。打印出epoch,似乎沒有時間信息,只有日期。

有沒有strptimeas.POSIXct的錯誤,還是我計算偏移或錯誤地生成epoch

+0

的( - )五個小時在你的時代,UNIX新紀元是GMT不EST。爲什麼你甚至想這樣做? 'dates'已經是一個可敬的POSIXct/POSIXt對象。 – mdsumner 2012-01-06 00:09:12

+0

在這裏,我將相對於EST的時代定義爲時代,而不是GMT。因此,抵消EST的日期不應該要求更正(除非我誤解「strptime」的工作原理)。我正在探索這個問題,我很好奇爲什麼我得到了錯誤的答案:http://stackoverflow.com/questions/8750075/for-loop-style-has-effect-on-class-coercion – 2012-01-06 00:14:32

回答

1

正如For loop style has effect on class coercion?的回答中所述,在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" 
+0

'strptime' does return一個'POSIXct',看'?strptime' – 2012-01-06 00:25:38

+0

呵呵。當我看''strptime'時,它說(在Details部分中):''strptime'將字符向量轉換爲'POSIXlt'類。這是R-2.14.1。這與我看到的返回值一致(通過'class(epoch)'或'dput(epoch)')。 – 2012-01-06 00:29:51

+0

我正在使用R-2.13.0(2011-04-13),對'strptime'的描述如下:「在字符表示和類對象之間轉換的函數」「POSIXlt」'和'「POSIXct」'表示日曆日期和時間。「當我運行'class(epoch)'時,它返回我期望的類型('POSIXct')。 – 2012-01-06 00:33:42

相關問題