设置xts索引

时间:2010-12-14 01:04:02

标签: r xts

构建一个包含两行的xts对象。

library(xts)   
junk<-xts(c(1,2),as.Date(c("2010-01-01","2010-05-01")))   
junk   
>            [,1]
> 2010-01-01    1   
> 2010-05-01    2   

为什么以下内容不会更改第一行的索引?

time(junk[1])<-as.Date("2010-02-01")   
junk   
>            [,1]
> 2010-01-01    1   
> 2010-05-01    2   

我意识到以下工作,但为什么上述工作没有?

time(junk)[1]<-as.Date("2010-02-01")   
junk   
>            [,1]
> 2010-02-01    1   
> 2010-05-01    2   

谢谢,
比尔

3 个答案:

答案 0 :(得分:7)

该帖子的直接回答是,正如约什所说,魔法在attr<-内部。首先对对象进行子集化,只需创建一个新对象,该对象在完成时间后立即处理掉。

此外,您可以通过.index()功能查看索引的“内部”。本质上是一个double或integer类型的向量,它映射到POSIXct时间 - 附加了一些属性。您要分配的课程会自动来回强制。这使内部更容易维护 - 并允许您在外部需要的任何时间类上执行操作。

一般来说,Date是保持TZ最简单的方法,可以解决问题,但请记住,隐藏方面的成本是函数index()。这将不得不重新创建您期望的对象。

答案 1 :(得分:3)

time(junk[1]) <- as.Date("2010-02-01") 

以上内容不会更改junk第一行的索引,因为子集会创建一个新对象 - 不会引用junk - 并且time<-.xts会替换索引新对象。

答案 2 :(得分:2)

时间序列中的日期未以“[”引用。它们更像是数据帧中的rownames。它们存储在属性列表的“索引”叶子中。除此之外,它们不是Date类,而是DateTime类,因此需要可以使用POSIXct:

> attributes(junk)$index[1] <- as.POSIXct("2010-02-01")
> junk
           [,1]
2010-02-01    1
2010-05-01    2

编辑:更准确地说,$ index属性在内部以秒为单位,但time方法将接受各种赋值类。