3

将 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)

使用来自 r- forge 的最新版本0.9-5.1输出:

           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 在合并之前将索引转换为同一个类(就像以前一样),或者现在让它工作的唯一方法是在合并之前自己强制索引类?

拥有对象属性会很棒,您可以在其中指定您在使用它时关心的时间精度级别(如果您使用日常数据等,也可以忽略时间)。

4

2 回答 2

3

编辑:我不确定它在 0.8-6 中工作的事实是错误还是期望的行为。

这是一个时区问题。日期被认为是 UTC 的午夜,因此 的索引x1是 UTC。但是,x2具有您的操作系统的时区。xts 对象的索引始终在内部存储为 POSIXct,这是自 UTC 纪元以来的秒数。如果您的时区不是 UTC,那么当 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
于 2013-07-22T17:10:01.800 回答
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’
于 2013-07-22T18:26:44.847 回答