这就是我想要的结果:
library(lubridate)
res <- structure(
c(
16160, 16251, 16343, 16435, 16525, 16616, 16708,
16800, 16891, 16982, 17074, 17166, 17256, 17347, 17439, 17531,
17621, 17712, 17804, 17896, 17986, 18077, 18169, 18261, 18352,
18443, 18535, 18627, 18717, 18808, 18900
),
class = "Date"
)
res
#> [1] "2014-03-31" "2014-06-30" "2014-09-30" "2014-12-31" "2015-03-31"
#> [6] "2015-06-30" "2015-09-30" "2015-12-31" "2016-03-31" "2016-06-30"
#> [11] "2016-09-30" "2016-12-31" "2017-03-31" "2017-06-30" "2017-09-30"
#> [16] "2017-12-31" "2018-03-31" "2018-06-30" "2018-09-30" "2018-12-31"
#> [21] "2019-03-31" "2019-06-30" "2019-09-30" "2019-12-31" "2020-03-31"
#> [26] "2020-06-30" "2020-09-30" "2020-12-31" "2021-03-31" "2021-06-30"
#> [31] "2021-09-30"
Run Code Online (Sandbox Code Playgroud)
不过,我必须将其生成为序列。
我已经设法使用 while 循环得到结果:
dateA <- min(res)
dateB <- max(res)
by <- months(3)
# initialize a vector to contain all dates:
myres <- dateA
while (TRUE) {
n <- length(myres)
next_date <- ceiling_date(myres[n] %m+% by, unit = by) - 1
# if next_date is less than dateB, add it to myres & continue looping:
if (next_date < dateB) {
myres[n + 1] <- next_date
next
}
# if next_date is equal to or greater than dateB, add it and terminate loop:
if (next_date >= dateB) {
myres[n + 1] <- next_date
break
}
}
identical(res, myres)
#> [1] TRUE
Run Code Online (Sandbox Code Playgroud)
我希望有这样的事情:
x <- seq.Date(from = dateA, to = dateB, by = "3 months")
x
#> [1] "2014-03-31" "2014-07-01" "2014-10-01" "2014-12-31" "2015-03-31"
#> [6] "2015-07-01" "2015-10-01" "2015-12-31" "2016-03-31" "2016-07-01"
#> [11] "2016-10-01" "2016-12-31" "2017-03-31" "2017-07-01" "2017-10-01"
#> [16] "2017-12-31" "2018-03-31" "2018-07-01" "2018-10-01" "2018-12-31"
#> [21] "2019-03-31" "2019-07-01" "2019-10-01" "2019-12-31" "2020-03-31"
#> [26] "2020-07-01" "2020-10-01" "2020-12-31" "2021-03-31" "2021-07-01"
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。
有没有比循环更简单的方法while?如果有任何正确方向的指示,我将不胜感激。
1)Base R将开始日期和结束日期加一以获得下个月的开始和结束,生成序列并减一以获得月份的结束时间。没有使用任何包。
st <- as.Date("2014-03-31")
en <- as.Date("2021-09-30")
seq(st + 1, en + 1, by = "3 months") - 1
## [1] "2014-03-31" "2014-06-30" "2014-09-30" "2014-12-31" "2015-03-31"
## [6] "2015-06-30" "2015-09-30" "2015-12-31" "2016-03-31" "2016-06-30"
## [11] "2016-09-30" "2016-12-31" "2017-03-31" "2017-06-30" "2017-09-30"
## [16] "2017-12-31" "2018-03-31" "2018-06-30" "2018-09-30" "2018-12-31"
## [21] "2019-03-31" "2019-06-30" "2019-09-30" "2019-12-31" "2020-03-31"
## [26] "2020-06-30" "2020-09-30" "2020-12-31" "2021-03-31" "2021-06-30"
## [31] "2021-09-30"
Run Code Online (Sandbox Code Playgroud)
2)yearmon也可以创建一个仅包含年/月而没有日期的yearmon 序列,然后as.Date.yearmon与frac=1指示它在转换为Date 类时使用月末的参数一起使用。
library(zoo)
st <- as.yearmon("2014-03-31")
en <- as.yearmon("2021-09-30")
as.Date(seq(st, en, 3/12), frac = 1)
Run Code Online (Sandbox Code Playgroud)
3) mondate mondate 包理解月末。计算开始和结束之间的月份差异,然后添加适当的顺序,如图所示。
library(mondate)
st <- mondate("2014-03-31")
en <- mondate("2021-09-30")
as.Date(mondate(st + seq(0, as.numeric(en - st), 3)))
Run Code Online (Sandbox Code Playgroud)
4) lubridate查找两个日期之间的月份数,然后添加月份序列。在这种情况下,它会理解我们想要月末。
library(lubridate)
st <- ymd("2014-03-31")
en <- ymd("2021-09-30")
st %m+% months(seq(0, round(interval(st, en) / months(1)), 3))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2524 次 |
| 最近记录: |