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
Другие вопросы по тегам