在将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属性非常棒,您可以在其中指定使用它时所关心的时间精度级别(如果使用日常数据等,则忽略时间)。
答案 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’