6

构建一个包含两行的 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   

谢谢,
比尔

4

3 回答 3

6

对这篇文章的直接回答是,attr<-正如乔希所说,魔法就在其中。首先对对象进行子集化只是创建一个新对象,一旦 time<- 完成,该对象就会立即被处理掉。

此外,您可以通过该.index()函数查看索引的“内部结构”。本质上是映射到 POSIXct 时间的双精度或整数类型的向量 - 附加了一些属性。您分配的课程会自动来回强制转换。这使得内部更容易维护 - 并让您可以在任何时间类之外进行操作。

一般来说, Date 将是避免 TZ 和 secs 麻烦的最干净的方法,但请记住,这个隐藏方面的成本是 function index()。这将不得不重新创建您期望的对象。

于 2011-01-28T22:37:13.887 回答
3
time(junk[1]) <- as.Date("2010-02-01") 

上面没有改变第一行的索引,junk因为子集创建了一个新对象——没有引用junk——并time<-.xts替换了新对象的索引。

于 2010-12-14T02:53:32.780 回答
2

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

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

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

于 2010-12-14T01:55:55.390 回答