2013-07-22 16 views
3

將xts與不同日期類別索引合併時,新版本的xts似乎有不同的行爲。與最新版本的xts對齊日期(錯誤)

下面是一個代碼示例:使用

library(xts) 
x1=xts(1:2,as.Date(c('1990-01-01','1991-01-01'))) 
x2=xts(3:4,as.POSIXct(c('1990-01-01','1991-01-01'))) 
merge(x1,x2) 

輸出最新版本0.9-5.1從r-鍛造:

  x1 x2 
1990-01-01 1 NA 
1990-01-01 NA 3 
1991-01-01 2 NA 
1991-01-01 NA 4 

使用相同版本0.8-6版本:

  x1 x2 
1990-01-01 1 3 
1991-01-01 2 4 

有沒有強制xts在合併之前強制xts將索引轉換爲同一個類(如之前那樣)或者現在唯一的方法是在合併之前自己強制索引類?

擁有對象屬性會很棒,您可以在其中指定您在使用它時關心的時間精度級別(如果您使用日常數據等,則忽略時間)。

+0

謝謝 - 發現你需要在這裏張貼之前編輯表。現在希望這個問題看起來可讀 – user2607648

+0

r-forge的版本是開發版本,在CRAN上你有'0.9.5'並且它工作 – dickoa

+0

0.9.5的行爲方式與0.9.5-1相同(輸出是相同和問題不固定) – user2607648

回答

3

編輯:我不確定它是否在0.8-6工作的事實是一個錯誤或期望的行爲。

這是一個時區問題。日期被認爲是UTC的午夜,所以x1的索引是UTC。但是,x2具有您的操作系統的時區。 xts對象的索引始終在內部存儲爲POSIXct,這是自UTC出現時間以來的秒數。如果您的時區不是UTC,那麼當您的OS的時區將UTC日期轉換爲POSIXct時,時間將不匹配。一種解決方法是將其中一個索引轉換爲與其他索引匹配。

> # Convert the POSIXct index to Date 
> index(x2) <- as.Date(index(x2)) 
> merge(x1,x2) 
      x1 x2 
1990-01-01 1 3 
1991-01-01 2 4 

> x2 <- xts(3:4,as.POSIXct(c('1990-01-01','1991-01-01'))) 
> # Convert the Date index to POSIXct 
> index(x1) <- as.POSIXct(format(index(x1))) 
> merge(x1, x2) 
      x1 x2 
1990-01-01 1 3 
1991-01-01 2 4 

我用format因爲as.POSIXct.Date不利用tz說法。


在這個例子中,有可能通過先設定一個TZ環境變量來解決。當然,根據您使用時區的方式,這可能會有其他含義。而且,只有在創建xts對象之前設置時區變量纔有效。

Sys.setenv(TZ="GMT") 
x1=xts(1:2,as.Date(c('1990-01-01','1991-01-01'))) 
x2=xts(3:4,as.POSIXct(c('1990-01-01','1991-01-01'))) 
merge(x1, x2) 
      x1 x2 
1990-01-01 1 3 
1991-01-01 2 4 
+0

謝謝 - 希望有一個工作,將不涉及改變一堆代碼,以升級到最新的xts版本 – user2607648

0

不是一個答案,只是爲了顯示OP是有與CRAN版本沒有問題(至少對我來說)

library(xts) 
x1=xts(1:2,as.Date(c('1990-01-01','1991-01-01'))) 
x2=xts(3:4,as.POSIXct(c('1990-01-01','1991-01-01'))) 

R> merge(x1,x2) 
      x1 x2 
1990-01-01 1 3 
1991-01-01 2 4 
R> packageVersion("xts") 
[1] ‘0.9.5’ 
+0

呵呵?你確定你有當前的CRAN版本嗎? – GSee

+0

您是否設置了時區環境變量? – GSee

+0

沒有我的時區env沒有設置沒有設置,是的,如果我沒記錯,我從CRAN下載。我會重新下載並測試它,看看 – dickoa