我有3个xts对象,其所有标记都是'Date'对象:
> a
a
1995-01-03 1.76
1995-01-04 1.69
> b
b
1995-01-03 1.67
1995-01-04 1.63
> c
c
1995-01-03 1.795
1995-01-04 1.690
验证指数是否相同:
> index(a) == index(b)
[1] TRUE TRUE
> index(a) == index(c)
[1] TRUE TRUE
现在我看到了这种奇怪的行为:
> merge.xts(a,b)
a b
1995-01-03 NA 1.67
1995-01-03 1.76 NA
1995-01-04 NA 1.63
1995-01-04 1.69 NA
虽然以下合并正常:
> merge.xts(a,c)
a c
1995-01-03 1.76 1.795
1995-01-04 1.69 1.690
我无法弄清楚这里可能会发生什么。有什么想法吗?
更新
> dput(a)
structure(c(1.76, 1.69), .indexCLASS = "Date", .indexTZ = "", .CLASS = "xts", class = c("xts",
"zoo"), index = structure(c(789168240, 789254580), tzone = "", tclass = "Date"), .Dim = c(2L,
1L), .Dimnames = list(NULL, "a"))
> dput(b)
structure(c(1.67, 1.63), .indexCLASS = "Date", .indexTZ = "", .CLASS = "xts", class = c("xts",
"zoo"), index = c(789109200, 789195600), .Dim = c(2L, 1L), .Dimnames = list(
NULL, "b"))
> dput(c)
structure(c(1.795, 1.69), .indexCLASS = "Date", .indexTZ = "", .CLASS = "xts", class = c("xts",
"zoo"), index = c(789109200, 789195600), .Dim = c(2L, 1L), .Dimnames = list(
NULL, "c"))
实际上,问题在于指数不相同(由.index(a) == .index(b)
验证)。转换为数字然后重新创建xts并使用asDate
重新计算日期解决了问题。
此对象是从xts。{/ p>中的to.daily
方法创建的
答案 0 :(得分:4)
当然这似乎很复杂,但原因是日期不精确。 日历日内的任何内容都是相同的“日期”。
正如Josh所提到的那样,您的数据是以不同的方式/来源创建的。我会尝试考虑一种更好的方法来管理这种可变性 - 因为它不是一个纯粹的新问题。在那之前:
index(x) <- index(x)
会做到这一点。为什么呢?
正如Josh所说,index(x)
[no <-
]采用基础POSIX time_t
表示并将其转换为日期(自纪元以来的天数)。通过index<-
替换原始索引将“日期”转换回POSIX时间(R中的POSIXct,C中的time_t
t1 <- Sys.time()
t2 <- Sys.time()
as.Date(t1) == as.Date(t2)
#[1] TRUE
t1 == t2
#[1] FALSE
x1 <- xts(1, t1)
x2 <- xts(2, t2)
indexClass(x1) <- "Date"
indexClass(x2) <- "Date"
cbind(x1,x2)
..1 ..2
2011-10-06 1 NA
2011-10-06 NA 2
.index(cbind(x1,x2))
[1] 1317925443 1317925447
attr(,"tzone")
[1] "America/Chicago"
attr(,"tclass")
[1] "Date"
# ugly, ugly solution
index(x1) <- index(x1)
index(x2) <- index(x2)
cbind(x1,x2)
..1 ..2
2011-10-06 1 2
.index(cbind(x1,x2))
[1] 1317877200
答案 1 :(得分:3)
您不能使用index()
来验证索引是否相同,因为它将索引转换为indexClass()
指定的索引。使用.index
获取原始数字索引,然后您可能会发现:
all(.index(a) == .index(b)) # is FALSE
您应该调查数据源以查看可能导致此问题的原因。要快速解决问题,请执行以下操作:
index(b) <- as.Date(index(b))