This may or may not be useful to others but I've written a more general function for calculating date sequences using a combination of lubridate, base and timechange.
It allows for either period or duration (base) arithmetic.
# remotes::install_github("NicChr/timeplyr")
library(timeplyr)
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#>
#> date, intersect, setdiff, union
seq(ymd('2012-04-07'),ymd('2013-03-22'),by='weeks')
#> [1] "2012-04-07" "2012-04-14" "2012-04-21" "2012-04-28" "2012-05-05"
#> [6] "2012-05-12" "2012-05-19" "2012-05-26" "2012-06-02" "2012-06-09"
#> [11] "2012-06-16" "2012-06-23" "2012-06-30" "2012-07-07" "2012-07-14"
#> [16] "2012-07-21" "2012-07-28" "2012-08-04" "2012-08-11" "2012-08-18"
#> [21] "2012-08-25" "2012-09-01" "2012-09-08" "2012-09-15" "2012-09-22"
#> [26] "2012-09-29" "2012-10-06" "2012-10-13" "2012-10-20" "2012-10-27"
#> [31] "2012-11-03" "2012-11-10" "2012-11-17" "2012-11-24" "2012-12-01"
#> [36] "2012-12-08" "2012-12-15" "2012-12-22" "2012-12-29" "2013-01-05"
#> [41] "2013-01-12" "2013-01-19" "2013-01-26" "2013-02-02" "2013-02-09"
#> [46] "2013-02-16" "2013-02-23" "2013-03-02" "2013-03-09" "2013-03-16"
time_seq(ymd('2012-04-07'),ymd('2013-03-22'),by='weeks')
#> [1] "2012-04-07" "2012-04-14" "2012-04-21" "2012-04-28" "2012-05-05"
#> [6] "2012-05-12" "2012-05-19" "2012-05-26" "2012-06-02" "2012-06-09"
#> [11] "2012-06-16" "2012-06-23" "2012-06-30" "2012-07-07" "2012-07-14"
#> [16] "2012-07-21" "2012-07-28" "2012-08-04" "2012-08-11" "2012-08-18"
#> [21] "2012-08-25" "2012-09-01" "2012-09-08" "2012-09-15" "2012-09-22"
#> [26] "2012-09-29" "2012-10-06" "2012-10-13" "2012-10-20" "2012-10-27"
#> [31] "2012-11-03" "2012-11-10" "2012-11-17" "2012-11-24" "2012-12-01"
#> [36] "2012-12-08" "2012-12-15" "2012-12-22" "2012-12-29" "2013-01-05"
#> [41] "2013-01-12" "2013-01-19" "2013-01-26" "2013-02-02" "2013-02-09"
#> [46] "2013-02-16" "2013-02-23" "2013-03-02" "2013-03-09" "2013-03-16"
# Months example
# Notice the difference between seq and time_seq
time_seq(dmy("31-01-2012"), dmy("31-01-2013"), by = "month")
#> [1] "2012-01-31" "2012-02-29" "2012-03-31" "2012-04-30" "2012-05-31"
#> [6] "2012-06-30" "2012-07-31" "2012-08-31" "2012-09-30" "2012-10-31"
#> [11] "2012-11-30" "2012-12-31" "2013-01-31"
seq(dmy("31-01-2012"), dmy("31-01-2013"), by = "month")
#> [1] "2012-01-31" "2012-03-02" "2012-03-31" "2012-05-01" "2012-05-31"
#> [6] "2012-07-01" "2012-07-31" "2012-08-31" "2012-10-01" "2012-10-31"
#> [11] "2012-12-01" "2012-12-31" "2013-01-31"
# DST example
dst <- dmy_hms("26-03-2023 00:00:00", tz = "GB")
# Base R
seq(dst, length.out = 5,
by = "hour")
#> [1] "2023-03-26 00:00:00 GMT" "2023-03-26 02:00:00 BST"
#> [3] "2023-03-26 03:00:00 BST" "2023-03-26 04:00:00 BST"
#> [5] "2023-03-26 05:00:00 BST"
time_seq(dst, length.out = 5,
by = "hour",
seq_type = "duration")
#> [1] "2023-03-26 00:00:00 GMT" "2023-03-26 02:00:00 BST"
#> [3] "2023-03-26 03:00:00 BST" "2023-03-26 04:00:00 BST"
#> [5] "2023-03-26 05:00:00 BST"
# Period arithmetic
time_seq(dst, length.out = 5,
roll_dst = "NA",
by = "hour",
seq_type = "period")
#> [1] "2023-03-26 00:00:00 GMT" NA
#> [3] "2023-03-26 02:00:00 BST" "2023-03-26 03:00:00 BST"
#> [5] "2023-03-26 04:00:00 BST"
time_seq(dst, length.out = 5,
roll_dst = "pre",
by = "hour",
seq_type = "period")
#> [1] "2023-03-26 00:00:00 GMT" "2023-03-26 00:00:00 GMT"
#> [3] "2023-03-26 02:00:00 BST" "2023-03-26 03:00:00 BST"
#> [5] "2023-03-26 04:00:00 BST"
time_seq(dst, length.out = 5,
roll_dst = "post",
by = "hour",
seq_type = "period")
#> [1] "2023-03-26 00:00:00 GMT" "2023-03-26 02:00:00 BST"
#> [3] "2023-03-26 02:00:00 BST" "2023-03-26 03:00:00 BST"
#> [5] "2023-03-26 04:00:00 BST"
# You can also mix dates and datetimes
seq(ymd('2012-04-07'), now(), by = "years")
#> Error in seq.Date(ymd("2012-04-07"), now(), by = "years"): 'to' must be a "Date" object
time_seq(ymd('2012-04-07'), now(), by = "years")
#> [1] "2012-04-07 UTC" "2013-04-07 UTC" "2014-04-07 UTC" "2015-04-07 UTC"
#> [5] "2016-04-07 UTC" "2017-04-07 UTC" "2018-04-07 UTC" "2019-04-07 UTC"
#> [9] "2020-04-07 UTC" "2021-04-07 UTC" "2022-04-07 UTC"
Created on 2023-03-28 with reprex v2.0.2