【问题标题】:How to subset xts object by end of quarter dates by sequence number?如何按序列号按季度结束日期对 xts 对象进行子集化?
【发布时间】:2017-11-14 12:08:17
【问题描述】:

我正在尝试根据数字位置从大型 xts 对象中提取季度末数据,但我不知所措。任何帮助将不胜感激。例如,假设我有一年的数据如下:

set.seed(78)
date.a <-seq(as.Date("2000/1/1"), as.Date("2000/12/31"), "days")
dat <-xts(rnorm(length(date.a)), date.a)

head(dat)
                 [,1]
2000-01-01  0.7172775
2000-01-02  0.2581460
2000-01-03  1.0750581
2000-01-04 -0.5375775
2000-01-05 -1.3264418
2000-01-06  1.1817348

我可以轻松地手动提取季度末数据,例如:

a <-dat[91]
b <-dat[182]  
c <-dat[274]
d <-dat[366]

c(a,b,c,d)
                 [,1]
2000-03-31  0.7329080
2000-06-30  1.0648634
2000-09-30 -3.1556240
2000-12-31  0.9452281

如何以编程方式提取这些日期/数据?挑战在于弄清楚数字序列如何在几年或几十年的过程中发挥作用。由于间隔不是标准的约 91 天,因此尚不清楚如何进行。有什么建议?谢谢!

【问题讨论】:

  • c 是一个糟糕的变量名选择,因为它在 R 中具有其他意义,但它在技术上会起作用。小心行事。

标签: r subset xts


【解决方案1】:

您可以创建一个日期向量d,并将xts 元素称为dat[d]

我会这样做(我喜欢使用 lubridate 包,我喜欢从 Excel 中模拟 EOMonth 函数):

library(lubridate)
EOMonth = function(d, step) {
  day(d) = 1 # just in case we inadvertantly compute 30 February or 31 April.
  month(d) = month(d) + step
  day(d) = days_in_month(d)
  return(d)
}
d = EOMonth(ymd("1999-12-31"), seq(from = 3, to = 12, by = 3))
dat[d]

如果您需要索引,则可以执行以下操作:

all.d = ymd("1999-12-31") + 1:366
answer = which(all.d %in% d)

【讨论】:

  • lebelinoz,这是一个优雅的解决方案,它可以很好地提取我展示的 a、b、c、d 示例。但由于不值得解释的原因,我需要这些日期的数字 ID,即 dat[91] 中的“91”,上面示例中 dat[182] 中的“182”。
  • 然而,一个小故障是季度结束之间的天数在几年内略有不同。当然,可能有一个修复。有人有想法吗?
  • 我的 EOMonth 方法应该可以弥补这一点。不是吗?
  • 以我举例的年份为例,但其他年份并不总是与顺序匹配,也就是说,有时季度末会在 28 日、29 日、30 日结束,或 31 日,具体取决于日历。
  • @lebelinoz 鉴于你已经硬编码了开始日期和季度,你可以使用%m+%:ymd("1999-12-31") %m+% months(seq(from = 3, to = 12, by = 3))
【解决方案2】:

您可以将日期转换为zoo::yearqtr。然后将yearqtr 转换回Date,同时设置frac = 1,即每个季度的最后一个日期(参见?yearmon)。使用这些日期对您的数据进行子集化:

dat[index(dat) == as.Date(as.yearqtr(index(dat)), frac = 1)]
#                 [,1]
# 2000-03-31  0.7329080
# 2000-06-30  1.0648634
# 2000-09-30 -3.1556240
# 2000-12-31  0.9452281

【讨论】:

  • Henrik,您的建议为有用的替代方法提供了基础。非常感谢!
  • @JamesPicerno 感谢您的反馈。很高兴听到你发现它有帮助。 zoo确实有很多方便的功能。
猜你喜欢
  • 2020-10-29
  • 2016-12-27
  • 2017-07-25
  • 2017-09-06
  • 2018-10-01
  • 2023-03-31
  • 2011-07-09
  • 2023-01-18
  • 2011-11-22
相关资源
最近更新 更多