在下面的代码中,我试图完成一个日期序列。我的开始日期是 5 月 31 日,结束日期是 8 月 31 日。当我在下面按月份
seq()
时,您会看到 2023 年 6 月被跳过,但 2023 年 7 月出现两次(该月的第一个和最后一个)。我想按月排序,以便每个月都出现在两个日期之间的序列中。我怎样才能实现这个目标?
library(tidyverse)
df1 <- data.frame(id = "1",
startdate = as.Date( "2023-05-31"),
enddate = as.Date("2024-08-31")) %>%
mutate(date_duration = startdate,
enddate = ceiling_date(enddate, "month") -1 ) %>%
complete(date_duration = seq(startdate, enddate, by = "month"))
一种选择是使用
lubridate::add_with_rollback
或 %m+%
,这说明了月份长度不同的事实。来自文档 (?add_with_rollback
)
Date %m+% Months(n) 始终返回 Date 之后第 n 个月的日期。
为了完成这项工作,我首先计算要添加到
startdate
的月数。
library(tidyverse)
data.frame(
id = "1",
startdate = as.Date("2023-05-31"),
enddate = as.Date("2024-08-31")
) %>%
mutate(
date_duration = startdate,
enddate = ceiling_date(enddate, "month") - 1
) %>%
complete(
date_duration = add_with_rollback(
startdate,
months(
seq_len(floor((enddate - startdate) / dmonths()))
)
)
) |>
arrange(date_duration)
#> # A tibble: 16 × 4
#> date_duration id startdate enddate
#> <date> <chr> <date> <date>
#> 1 2023-05-31 1 2023-05-31 2024-08-31
#> 2 2023-06-30 <NA> NA NA
#> 3 2023-07-31 <NA> NA NA
#> 4 2023-08-31 <NA> NA NA
#> 5 2023-09-30 <NA> NA NA
#> 6 2023-10-31 <NA> NA NA
#> 7 2023-11-30 <NA> NA NA
#> 8 2023-12-31 <NA> NA NA
#> 9 2024-01-31 <NA> NA NA
#> 10 2024-02-29 <NA> NA NA
#> 11 2024-03-31 <NA> NA NA
#> 12 2024-04-30 <NA> NA NA
#> 13 2024-05-31 <NA> NA NA
#> 14 2024-06-30 <NA> NA NA
#> 15 2024-07-31 <NA> NA NA
#> 16 2024-08-31 <NA> NA NA
使用以下方法可以获得相同的结果:
date_duration = startdate %m+% months(
seq_len(floor((enddate - startdate) / dmonths()))
)