XTS слияния странное поведение
У меня есть 3 объекта XTS, все признаки которых являются объектами "Дата":
> 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
исправил проблему.
Эти объекты были созданы из to.daily
метод из хтс.
2 ответа
Вы не можете использовать index()
чтобы убедиться, что индексы одинаковы, потому что он преобразует индекс в то, что указано indexClass()
, использование .index
чтобы получить необработанный числовой индекс, то вы, вероятно, обнаружите, что:
all(.index(a) == .index(b)) # is FALSE
Вы должны исследовать свой источник данных, чтобы понять, что может быть причиной этого. Для быстрого исправления сделайте это:
index(b) <- as.Date(index(b))
Это кажется запутанным, конечно, но причина в том, что Дата неточна. Все в течение календарного дня - это та же самая "дата".
Где-то, как упоминал Джош, является тот факт, что ваши данные создаются разными способами / источниками. Я попытаюсь придумать лучший способ управления этой изменчивостью, поскольку это не совсем новая проблема. До тех пор:
index(x) <- index(x)
сделает свое дело. Зачем?
Как отмечает Джош, index(x)
[нет <-
] принимает базовый POSIX time_t
представление и преобразует его в дату (дни с начала эпохи). Замена исходного индекса через index<-
преобразует "Дата" обратно во время POSIX (POSIXct в R, 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