如何在R中对时间序列进行滞后日期索引?

3
重新提问如下:
我已经有了一些进展,但是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的部分似乎覆盖了它!我还发现了意外的NA行。仍在努力解决这个问题...
<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

我想要在每一行中创建一个新列,其中包含下一行的日期索引的衍生版本。
              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       [...]

“对于数值(使用滞后)很容易做到,但对于日期索引本身不是那么容易。我可能可以通过使用各种查找等方法来解决它,但这很凌乱。您必须匹配其他字段,或者调整行号,这感觉不太符合R的精神。有没有一种漂亮、简洁、优雅的方法来做到这一点?我相信只要有人给出答案,我就会恍然大悟!但到目前为止,我在这个网站上没有找到关于滞后日期索引的答案。我想这样做的原因是我想使用每一对行中的日期来查询另一个系列。所以可能有更好的方法。”

你的实际对象在 R 中属于哪个类? - A5C1D2H2I1M1N2O1R2T1
@Roland 我想使用thisDate和nextDate作为参数来计算所有原始数据的平均值。这个例子中的表格已经是其中的一个摘录了。thisDate和nextDate定义了样本窗口的开始和结束。 - Bit Rocker
@DirkEddelbuettel 好的,还有其他我可以使用的东西吗?我能把日期用儒略日格式(或者从1970年1月1日开始的天数)表示,并且以后再转换回日期吗? - Bit Rocker
1
@BitRocker:我建议重新考虑一下你想做的事情。我的偏好是使用 merge(X, lag(X)) 这个在 xts 中廉价且快速的方法。如果你真的需要额外的日期列(为什么?),那就切换到使用 data.frame 并且放弃使用 xts。由你决定。 - Dirk Eddelbuettel
1
@BitRocker:关于你的滑动平均,zooxts已经为你做好了。阅读zoo文档以获取灵感。 - Dirk Eddelbuettel
显示剩余3条评论
3个回答

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)

哇,太棒了。现在我需要弄清楚它是如何工作的……谢谢! - Bit Rocker
@user1317221_G,我确实还在考虑 - 我不是使用像你示例中的文本表格,而是重新设计它以与xts的实际日期索引一起使用。我使用index(<xts.table>)来访问它。这会导致df$dates[df$dates[2]: bit出现错误,我用df$dates([2])替换了它。 - Bit Rocker
我需要做的是将thisDate和nextDate粘贴到原始向量的末尾(该向量有多列 - 我只为上面的示例提取了最基本的部分)。 问题在于,R似乎无法处理不同类型的数据混合。 如果我将日期添加为字符串,所有现有数字都会被添加引号。 如果我将日期添加为日期,它们将以(我认为)从1970年1月1日或UNIX启动日期开始的天数显示。 我肯定会达到目标的... - Bit Rocker
如果您呈现dput(yourTS)的输出,我相信您会得到适合您情况的答案。然而,我真的建议您呈现整个问题,而不仅仅是您认为卡住了的步骤。可能有更好的方法来实现您的目标。 - Roland
@BitRocker 关于“R似乎无法处理混合不同类型的数据”的问题。这是因为XTS在底层是一个矩阵,意味着所有值都必须是相同的类型。因此,您不能同时拥有一些数字列和一些日期列。我通常使用数据框架来解决这个问题,如本答案所示。我使用过的其他解决方案包括两个xts对象的列表,一个用于数字,一个用于日期。另一个解决方案是将日期列附加到主日期列的属性中。然而,如果您想按行处理数据,则这些替代解决方案就不太有用了。 - Darren Cook
显示剩余2条评论

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) 

注意:在计算时间段平均值时,应包括开始时间但不包括结束时间。

嗯,这很有趣。让我再想一想。 - Bit Rocker
好的,这个答案启发了我创建正确的解决方案。很多人帮助过我,但这绝对是让我成功的方法。除非有人反对,否则我将给它打分。 - Bit Rocker

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 的秒精度,但你应该能够通过一点努力从上面的日期/整数情况得到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接