timeBasedSeq函数重复它创建的一些日子!

时间:2011-05-20 15:39:43

标签: r xts

我正在使用xts包中的timeBasedSeq函数作为时间序列/ zoo对象中的索引,但它会重复它创建的一些日子!这导致动物园出现问题,因为“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 个答案:

答案 0 :(得分:4)

错误在xts中。该函数使用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}}

答案 1 :(得分:1)

扩展我的评论:该错误是通过夏令时的变化来解释的。此时加上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"
...