使用r获取上市股票的相关季度日期



试图生成一个函数,该函数确定给定当前日期的前3个相关季度日期。基本上,我会检查我所处的季度,然后抓住前三个季度,如果目前是第二季度,我需要2021年第三季度、2021年第四季度和2022年第一季度,这可能会变得复杂。为什么我的函数目前返回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)

我将通过使用润滑包中的函数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)

你可以用这个来获取前一季度的数据吗?

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"

在2022-05-18由reprex包(v2.0.1)创建

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

如果要将其转换为季度的第一个或最后一个日期作为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"

最新更新