日期(错误)与最新版本的xts对齐

时间:2013-07-22 17:01:47

标签: r date alignment 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)

使用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在合并之前将索引转换为同一个类(如前所述),或者现在使其工作的唯一方法是在合并之前自己强制使用索引类?

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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’