如何在R中的时间序列中延迟日期索引?

时间:2012-09-15 10:31:37

标签: r date xts lag s

我已经取得了一些进展,但我从R ...得到了奇怪的行为。

这是我开始的xts

<no title>  Value   Value2  Value3
2002-08-21  21      2       27
2003-09-10  22      42      87
2004-02-12  23      62      67
2005-04-13  24      13      73
2006-05-13  25      4       28
2007-08-14  20      68      25
2008-03-06  19      82      22

我想要制作的东西:

 <no title> Value   Value2  Value3  ThisDate    NextDate
    2002-08-21  21      2       27      2002-08-21  2003-09-10
    2003-09-10  22      42      87      2003-09-10  2004-02-12
    2004-02-12  23      62      67      2004-02-12  2005-04-13
    2005-04-13  24      13      73      2005-04-13  2006-05-13
    2006-05-13  25      4       28      2006-05-13  2007-08-14
    2007-08-14  20      68      25      2007-08-14  2008-03-06
    2008-03-06  19      82      22      2008-03-06  NA

我写了这样一个函数:

StackUpAdjacentDates <- function(sourceTimeSeries)
{
    returnValue <- sourceTimeSeries

    thisDate <- as.character(index(sourceTimeSeries))
    nextDate <- c(as.character(thisDate[2:length(thisDate)]),NA)

    thisDate <- as.Date(strptime(thisDate, "%Y-%m-%d"))
    nextDate <- as.Date(strptime(nextDate, "%Y-%m-%d"))

    # set up thisDate in a new column
    if ("thisDate" %in% colnames(returnValue) )
    {
        returnValue<-returnValue[,-which(colnames(returnValue)=="thisDate")]
    }
    returnValue <- cbind(returnValue, thisDate)
    colnames(returnValue)[ncol(returnValue)] <- "thisDate"
    returnValue$thisDate <- thisDate

    # add nextDate in a new column
    if ("nextDate" %in% colnames(returnValue) )
    {
        returnValue<-returnValue[,-which(colnames(returnValue)=="nextDate")]
    }
    returnValue <- cbind(returnValue,nextDate)
    colnames(returnValue)[ncol(returnValue)] <- "nextDate"
    #returnValue$nextDate <- nextDate

}

这成功添加了thisDate(在命令行中逐步运行代码)。但是添加nextDate的位似乎覆盖了它!我似乎也得到了意想不到的一排NAs。还在努力......

<no title>  Value   Value2  Value3  nextDate
2002-08-21  21      78      76      12305
2003-09-10  22      70      23      12460
2004-02-12  23      84      22      12886
2005-04-13  24      97      28      13281
2006-05-13  25      26      97      13739
2007-08-14  20      59      22      13944
2008-03-06  19      64      98      NA
<NA>        NA      NA      NA      NA

我在第一列中添加了“无标题”,表示它是xts日期索引,而不是实际上是矢量/矩阵的一部分。

关于删除额外行的一点是因为我还没有解决覆写问题并且正在进行实验。它不需要在最终答案中存在,而是我目前所处的位置。

最后,当我查询这个结果并尝试将nextDate转换为我得到的日期....

> as.Date(returnValue$nextDate)
Error in as.Date.default(returnValue$nextDate) : 
  do not know how to convert 'returnValue$nextDate' to class "Date"

所以我有点混乱......

下面的原始问题:

我在R中有一个时间序列(我学得很快,但显然不够快!)像这样

             Value
2002-08-21    21
2003-09-10    22
2004-02-12    23
2005-04-13    24
2006-05-13    25
2007-08-14    20
2008-03-06    19

我想在每行的新列中使用NEXT行中的日期索引创建它的衍生物:

              Value    NextDate
2002-08-21    21       2003-09-10
2003-09-10    22       2004-02-12
2004-02-12    23       2005-04-13
2005-04-13    24       2006-05-13
2006-05-13    25       2007-08-14
2007-08-14    20       2008-03-06
2008-03-06    19       [...]

很容易为Value(使用Lag)而不是date-index iteself。

我可以使用各种查找等来解决这个问题,但它很麻烦。你必须在其他一些领域上进行匹配,或者使用行数进行调整,这些行数对R来说并不是很“真实”。

有一种漂亮,整洁,优雅的方式吗?

我很确定我会去“D'OH!”一旦有人给出答案!但到目前为止,我还没有在这个网站上找到一个滞后日期索引的答案。

我想要这样做的原因是我想连续使用每对日期来查询另一个系列。所以可能有更好的方法来做到这一点。

3 个答案:

答案 0 :(得分:2)

我不确定xts对于您尝试做什么是最好的,但是对于它的价值在于如何获取xts对象,请创建dataframe和创建所需的额外时间列,然后将其转换为时间格式。

 data(sample_matrix)
 x <- as.xts(sample_matrix)
 head(x)
 df <-as.data.frame(x)
 head(df)
 newdates<-rownames(df)

 df$nextdates<-c(newdates[2:length(newdates)],"NA")
 df$nextdates<-as.POSIXct(strptime(df$nextdates, "%Y-%m-%d"))
 head(df)

答案 1 :(得分:1)

我认为这与你真正想做的事情类似:

library(xts)
#create example xts
times <- seq(as.Date('2002-08-21'),as.Date('2002-09-06 '),by="day")
myts <- xts(x=1:length(times),order.by=times)

#second xts, with start and end times
times2 <- c("2002-08-21","2002-08-31","2002-09-06")    
myts2 <- myts[times2] 

#get start and end times
ix <- index(myts2)

#get positions in myts
ep <- which(index(myts) %in% ix)-1

#calculate means
period.apply(myts,ep,mean) 

注意:这包括开始时间,并在计算期间平均值时排除结束时间。

答案 2 :(得分:0)

我相信你要找的是:

dayDifff <- function(X)
{
    as.numeric(as.Date(index(X))) - c(NA, as.numeric(as.Date(index(X[-nrow(X)]))))
}

其中X是xts对象。我已将原始POSIXct次转换为日期,并在头部添加了NA并使用X[-nrow(X)]取消了最终日期。

如果你有几秒钟的时间等,你需要保持POSIXct的第二个精度,但你应该能够从上面的日期/整数情况得到一点点努力。