我正在使用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次,我怎么能避免这种情况?
答案 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"
...