r - 使用 R 获取公共 Stocks 的相关季度 dates

尝试生成一个函数来确定当前日期的前 3 个相关季度 dates。基本上,我正在检查我所在的季度,然后抓住前三个季度,如果当前是 Q2 并且我需要 2021 年第三季度、2021 年第四季度和 2022 年第一季度,这可能会变得复杂。为什么我的函数目前对所有 values 我都返回 NA我很困惑!请给我建议或解决方案谢谢!

# set dates
first.date <- Sys.Date() - 60
last.date <- Sys.Date()
current.year <- format(last.date, format ="%Y")

quarters <- quarter(first.date)
prev.year <- as.numeric(current.year) - 1

quart.df <- data.frame(month = c(3, 6, 9, 12),
                       day = c(31, 30, 30, 31))

getQs <- function(date.curr){
  current.year <- format(date.curr, format ="%Y")
  prev.year <- as.numeric(current.year) - 1
  prev.year <- str(prev.year)
  q <- quarter(date.curr)
  day <- 
  rel.qs <- c()
  if (q == 1){
    rel.qs[1] <- as.Date(with(quart.df, paste(prev.year,month[2],day[2])), "%Y-%m-%d")
    rel.qs[2] <- as.Date(with(quart.df, paste(prev.year,month[3],day[3])), "%Y-%m-%d")
    rel.qs[3] <- as.Date(with(quart.df, paste(prev.year,month[4],day[4])), "%Y-%m-%d")
  }
  if (q == 2){
    rel.qs[1] <- as.Date(with(quart.df, paste(prev.year,month[3],day[3])), "%Y-%m-%d")
    rel.qs[2] <- as.Date(with(quart.df, paste(prev.year,month[4],day[4])), "%Y-%m-%d")
    rel.qs[3] <- as.Date(with(quart.df, paste(current.year,month[1],day[1])), "%Y-%m-%d")
  }
  if (q == 3){
    rel.qs[1] <- as.Date(with(quart.df, paste(prev.year,month[4],day[4])), "%Y-%m-%d")
    rel.qs[2] <- as.Date(with(quart.df, paste(current.year,month[1],day[1])), "%Y-%m-%d")
    rel.qs[3] <- as.Date(with(quart.df, paste(current.year,month[2],day[2])), "%Y-%m-%d")
  }
  else{
    rel.qs[1] <- as.Date(with(quart.df, paste(current.year,month[1],day[1])), "%Y-%m-%d")
    rel.qs[2] <- as.Date(with(quart.df, paste(current.year,month[2],day[2])), "%Y-%m-%d")
    rel.qs[3] <- as.Date(with(quart.df, paste(current.year,month[3],day[3])), "%Y-%m-%d")
  }
  return(rel.qs)
}

getQs(last.date)

回答1

我将通过使用 lubridate 包中的函数 ceiling_date() 来解决这个问题。这将是我的建议:

CurrentDate <- Sys.Date()

getQs <- function(StartDate, QuartersBack){
  
  vec.Dates <- vector(length = QuartersBack)
  class(vec.Dates) <- "Date"
  
  for (i in c(1:QuartersBack)) {
    vec.Dates[i] <- lubridate::ceiling_date(StartDate %m-% months(3*i), "quarter") - 1
  }
  
  vec.Dates
}
  
getQs(StartDate = CurrentDate, QuartersBack = 3)

回答2

你能用它来获得前几个季度吗?

library(tidyverse)
library(clock)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:clock':
#> 
#>     as_date
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union

today <- date_today(Sys.timezone())
  
# Last 3 quarters
ceiling_date(today - months(3), "quarter") - 1
#> [1] "2022-03-31"
ceiling_date(today - months(6), "quarter") - 1
#> [1] "2021-12-31"
ceiling_date(today - months(9), "quarter") - 1
#> [1] "2021-09-30"

https://reprex.tidyverse.org (v2.0.1) 于 2022-05-18 创建

回答3

yearqtr 类将年份和季度表示为年份加上分数 0、1/4、1/2 和 3/4,因此给定一个 date 这将前 3 个季度作为 yearqtr 对象。下面我们使用 2022 年 5 月 18 日作为输入,对应于 2022 年第二季度。

如果要将其转换为季度的第一个或最后一个 date 作为 Date 对象,请使用 as.Date(...) 作为开始或使用 as.Date(..., frac = 1) 作为结束。如果要将它们转换为字符,请使用 format(...)。参见 ?format.yearqtr

library(zoo)

input <- as.Date("2022-05-18")
as.yearqtr(input) - 1:3/4
## [1] "2022 Q1" "2021 Q4" "2021 Q3"