Функция timeBasedSeq повторяет некоторые дни, которые она создает! - PullRequest
4 голосов
/ 20 мая 2011

Я использую функцию timeBasedSeq из пакета xts для использования в качестве индекса в объекте временного ряда / зоопарка, но она повторяет некоторые дни, которые она создает! Что и вызывает проблемы с зоопарком, потому что «записи индекса в« order.by »не являются уникальными».

Например:

timeBasedSeq ("19860601/19861231")

создаст

... "1986-10-23" "1986-10-24" "1986-10-25" "1986-10-26" "1986-10-26" "1986-10-27" "1986 -10-28 "" 1986-10-29 "" ...

Так почему-то повторяется 26-е, как я могу избежать этого?

Ответы [ 2 ]

4 голосов
/ 20 мая 2011

Ошибка в хтс. Эта функция использует seq.POSIXct, и такое же поведение можно получить с помощью:

seq(as.POSIXct("1986-10-01"), as.POSIXct("1986-11-01"), by="day")

И еще более удивительно для меня seq.POSIXlt

seq(as.POSIXlt("1986-10-01"), as.POSIXlt("1986-11-01"), by="day")

Но это поведение хорошо документировано в seq.POSIXt, и есть положение для использования by="DSTday", которое, вероятно, следовало бы использовать авторам xts для ситуации, когда дни являются неявным интервалом. Временный обходной путь:

timeBasedSeq("19860601/19861231")[ !duplicated(timeBasedSeq("19860601/19861231") ]

или более компактно:

unique(timeBasedSeq("19860601/19861231"))
1 голос
/ 20 мая 2011

Чтобы расширить мой комментарий: ошибка объясняется переходом на летнее время. На этом этапе добавление 24 часов не переместит вас на следующий день, поскольку час снят.

> as.POSIXct("1986-10-26")
[1] "1986-10-26 BST"
> as.POSIXct("1986-10-26")+24*60*60
[1] "1986-10-26 23:00:00 GMT"

Одним из решений было бы создание даты вокруг полудня, а не полуночи, и использование strftime для удаления посторонней информации и as.POSIXlt для преобразования обратно во временной класс:

as.POSIXlt(strftime(timeBasedSeq("19860601 1200/19861231/d"),"%Y-%m-%d"))

...
[146] "1986-10-24" "1986-10-25" "1986-10-26" "1986-10-27" "1986-10-28"
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...