【发布时间】:2021-05-18 15:40:46
【问题描述】:
联邦财政年度从 10 月 1 日 到 9 月 30 日,由结束日期的年份确定。例如,FY20 是从 2019 年 10 月 1 日到 2020 年 9 月 30 日。
给定一个具有唯一 ID、开始日期和结束日期的数据框,我如何获得一个包含这些日期之间所有会计年度的长表,而无需编写计算来手动验证每个会计年度?
ID START_DT END_DT
1 08/15/17 08/15/19
2 08/15/17 08/15/18
可重现的例子:
dat <- data.frame(id = c(1, 2),
start_dt = c(as.Date("2017-08-15"), as.Date("2017-08-15")),
end_dt = c(as.Date("2019-08-15"), as.Date("2018-08-15")))
期望的最终结果:
ID FY
1 17
1 18
1 19
2 17
2 18
编辑:可能的解决方案
这是受 Jon Spring 建议启发的一种解决方案:
dat <- data.frame(id = c(1, 2),
start_dt = c(as.Date("2017-08-15"), as.Date("2017-08-15")),
end_dt = c(as.Date("2019-08-15"), as.Date("2018-08-15")))
dat_fy <- data.frame(date_seq = seq(from = min(dat$start_dt),
to = max(dat$end_dt),
by = 1)) %>%
mutate(fy = ifelse(month(date_seq) <= 9,
year(date_seq),
year(date_seq) + 1))
dat %>%
full_join(dat_fy, by = character()) %>%
filter(date_seq >= start_dt & date_seq <= end_dt) %>%
distinct(id, fy)
【问题讨论】:
-
这听起来很适合使用非等连接,可以使用
data.table、sqldf或fuzzyjoin应用。首先创建一个 FY-end 日期列表,然后加入它,条件是 start 早于这些日期,end 晚于这些日期。 -
非常感谢。我最终使用了带有查找表的基于连接的解决方案
标签: r