构建一个包含两行的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
谢谢,
比尔
答案 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方法将接受各种赋值类。