R中子集x个月前的数据

时间:2019-10-15 01:18:31

标签: r

我有来自Yahoo Finance的数据,我想查找3个月前的仅子集数据,然后在6个月前进行同样的操作。我的DF是:

getSymbols("^IRX", from="2019-01-02")

最简单的解决方案是从今天开始使用-90和-180进行子集化。

Df.3m <- IRX[paste(Sys.Date()-90,"::", sep="")]
Df.6m <- IRX[paste(Sys.Date()-180,"::", sep="")]

但是问题是3个月的某个时间会增加一两天(或更短)。是否有一个软件包可以找到3个月前的确切日期,以便我可以将其用作子集?

2 个答案:

答案 0 :(得分:2)

您可以使用lubridate软件包获取抵消日期:

library(lubridate)
dt <- Sys.Date() %m-% months(3)
Df.3m <- IRX[paste0(dt,"::")]

答案 1 :(得分:0)

我最终创建了一个似乎有效的快速功能:

Find.Date.x.month.ago <- function(current_date, x){
  Current.month <- month(current_date)
  Past.x.month <- Current.month - x
  if(Past.x.month < 0){
    Past.x.month <- 12 + Past.x.month  
  }
    trgt.day <- day(current_date)
  while (is.na(lubridate::ymd(paste(year(current_date), Past.x.month, trgt.day, sep="-"))) == TRUE) {
    trgt.day <- trgt.day - 1
  }
  return(lubridate::ymd(paste(year(current_date), Past.x.month, trgt.day, sep="-")))
}

尝试在5月30日进行确认是否可以处理2月的问题:

test.date <- "2019-05-30"
> suppressWarnings(Find.Date.x.month.ago(test.date, 3))
[1] "2019-02-28"
> suppressWarnings(Find.Date.x.month.ago(test.date, 6))
[1] "2019-11-30"