lubridate v1.8.0中round_date无法按中点四舍五入至最近季度的求助
解决lubridate::round_date()季度四舍五入不符合预期的问题
当使用lubridate::round_date()对日期按季度四舍五入时,默认逻辑会将所有日期向下取整,无法实现“季度中点后向上取整”的需求。可以通过自定义函数来实现预期的四舍五入逻辑。
实现步骤
- 加载所需包
library(lubridate) library(tibble) library(dplyr)
- 构造测试数据
test_dates <- tibble( original_date = ymd(c( "2022-01-01", "2022-02-14", "2022-02-15", "2022-03-31", "2022-04-01", "2022-05-15", "2022-06-30" )) )
- 自定义季度四舍五入函数
这个函数会计算每个日期所在季度的中点,根据原日期与中点的比较结果,决定是向下取整到当前季度起始,还是向上取整到下一季度起始:
round_to_quarter <- function(date_col) { current_q_start <- floor_date(date_col, "quarter") next_q_start <- ceiling_date(date_col, "quarter") q_midpoint <- current_q_start + (next_q_start - current_q_start) / 2 if_else(date_col >= q_midpoint, next_q_start, current_q_start) }
- 应用函数并查看结果
test_dates %>% mutate(rounded_quarter = round_to_quarter(original_date))
运行后得到的结果:
# A tibble: 7 × 2 original_date rounded_quarter <date> <date> 1 2022-01-01 2022-01-01 2 2022-02-14 2022-01-01 3 2022-02-15 2022-04-01 4 2022-03-31 2022-04-01 5 2022-04-01 2022-04-01 6 2022-05-15 2022-07-01 7 2022-06-30 2022-07-01
逻辑说明
current_q_start:获取日期所在季度的起始日期(如2022-02-15所在季度起始为2022-01-01)next_q_start:获取下一季度的起始日期(如2022-02-15的下一季度起始为2022-04-01)q_midpoint:计算当前季度的中点日期(如Q1 2022的中点是2022-02-15)- 通过
if_else判断原日期是否大于等于中点,决定舍入方向
内容的提问来源于stack exchange,提问作者Chris Kiniry
相关产品推荐
相关产品推荐

