我試圖找出 R 中給定日期最接近的下一個季度結束日期。例如,如果輸入是“2022-02-23”,則輸出應該是“2022-03-31”,如果輸入是“ 2022-03-07”,輸出應為“2022-06-30”。如果輸入為“2021-12-15”,則輸出應為“2022-03-31”。R中有什么功能嗎?
uj5u.com熱心網友回復:
lubridate::quarterwith argumenttype = "date_last"會讓你大部分時間到達那里。從評論來看,如果日期在一個季度的最后一個月,您似乎想跳到下一個季度;我們可以通過在傳遞到之前為每個日期添加一個月來實作這一點quarter。我們可以使用運算子安全地添加月份%m %。
library(lubridate)
dates_in <- ymd(c("2022-02-23", "2022-03-07", "2021-12-15"))
dates_out <- quarter(dates_in %m % months(1), type = "date_last")
dates_out
# "2022-03-31" "2022-06-30" "2022-03-31"
uj5u.com熱心網友回復:
請使用 lubridate 的四分之一函式查看此類函式
last_day_in_quarter <- function(d){
require(lubridate)
last_month_in_quarter <- ymd(paste(year(d),quarter(d)*3,1))
return(last_month_in_quarter %m % months(1) - 1)
}
last_day_in_quarter(ymd("2021-12-15")) #"2021-12-31"
last_day_in_quarter(ymd("2022-02-15")) #"2022-03-31"
last_day_in_quarter(ymd("2021-05-15")) #"2021-06-30"
last_day_in_quarter(ymd("2021-07-15")) #"2021-09-30"
uj5u.com熱心網友回復:
我認為,如果您使用真正的年-季-日型別,這些問題會變得非常容易理解。時鐘包里有一個(我是作者)。
library(clock)
x <- date_parse(c("2022-02-23", "2022-03-07", "2021-12-15"))
x
#> [1] "2022-02-23" "2022-03-07" "2021-12-15"
# What quarter are we in now?
yqd <- as_year_quarter_day(x)
yqd
#> <year_quarter_day<January><day>[3]>
#> [1] "2022-Q1-54" "2022-Q1-66" "2021-Q4-76"
# Is the current month the same as the end-of-quarter month?
# (if so, we are going to shift forward by 1 quarter).
shift <- get_month(x) == get_month(as.Date(set_day(yqd, "last")))
shift
#> [1] FALSE TRUE TRUE
# Shift by 1 quarter where applicable
yqd[shift] <- yqd[shift] duration_quarters(1)
yqd
#> <year_quarter_day<January><day>[3]>
#> [1] "2022-Q1-54" "2022-Q2-66" "2022-Q1-76"
# Set day to end of quarter
yqd <- set_day(yqd, "last")
yqd
#> <year_quarter_day<January><day>[3]>
#> [1] "2022-Q1-90" "2022-Q2-91" "2022-Q1-90"
# Now convert back to Date
as.Date(yqd)
#> [1] "2022-03-31" "2022-06-30" "2022-03-31"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/434270.html
