【问题标题】:Extract values from an xts object based on dates in data.frame rownames根据 data.frame 行名中的日期从 xts 对象中提取值
【发布时间】:2015-10-17 14:10:32
【问题描述】:

我正在进行多周期分析,我需要从名为data 的 xts 对象中提取两个日期之间的值。

我计算的开始和结束位于这些日期之间。这些相同的日期在名为 results 的 data.frame 中用作 rownames

start_date <- head(rownames(results), n=1)
end_date <- tail(rownames(results), n=1) 

我还用这个向量标识列名:

> col_names
[1] "Stock1" "Stock2" "Stock3" 

我需要在col_names 的列中以及start_dateend_date 之间的列中提取data 对象中的观察结果。

【问题讨论】:

  • 这些变量是从来自其他计算的数据框产生的。我的代码似乎工作得很好。它们都是包含结束和开始日期的字符向量

标签: r indexing xts


【解决方案1】:

假设'start_date'和'end_date'是'Date'格式的'character'向量('%Y-%m-%d'),我们paste他们和sep='/'一起使用作为行索引,将“col_names”指定为列索引,并将xts对象“数据”作为子集。

data[paste(start_date, end_date, sep="/"), col_names]

作为一个可重现的例子

library(xts)
data(sample.xts)
start_date <- '2007-01-02'
end_date <- '2007-01-05' 
col_names <-  c('Open', 'High')
sample.xts[paste(start_date, end_date, sep="/"), col_names]
#               Open     High
#2007-01-02 50.03978 50.11778
#2007-01-03 50.23050 50.42188
#2007-01-04 50.42096 50.42096
#2007-01-05 50.37347 50.37347

如果我们需要 'start_date' 和 'end_date' 之间的行

sample.xts[index(sample.xts) > start_date &
            index(sample.xts) < end_date, col_names]
#               Open     High
#2007-01-03 50.23050 50.42188
#2007-01-04 50.42096 50.42096

【讨论】:

  • 太完美了,这很有帮助。有没有办法改变该功能内的时间段?我尝试使用 start_date + 5 和 end_date + 5,以便它使用 start_date 和 end 前 5 天的时间段,但它没有用。
  • @AlexBădoi 试试as.Date(start_date)+5。对于示例数据集,sample.xts[paste(as.Date(start_date)+5, as.Date(end_date)+5, sep='/'), col_names] 工作
  • @AlexBădoi 是的,你是对的,它包括所有日历日。一种选择是使用is.weekend 对日期进行子集化。我猜这个link 可以帮助你做到这一点。
  • @AlexBădoi 正如我之前提到的,我的解决方案是基于您之前的描述。如果您之前正确地提到了这个问题,那将节省我们双方的时间。现在,它完全不同了,应该是一个新问题。否则,人们会更新 n 次,并且每次更新问题时回答者都必须回答。
  • 知道了。我将发布一个关于它的新问题。
猜你喜欢
  • 2016-01-16
  • 2015-03-04
  • 1970-01-01
  • 2020-09-05
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多