備忘ログ

チラシの裏的備忘録&メモ

Rで1年ごと、1ヶ月ごとの日付のベクトルを作る

タイトルの通り。たまにやるがしばしば失念するのでメモ。こういう事するとき本当に必要なのは年数までか、月数までで、日付はそんなに重視されていないことが個人的に使用するときには多い気がする。

1年ごとのベクトルを任意の日付から任意の日付まで(始点基準)作る。

seq.Date(as.Date("1989-01-02"), as.Date("2000-01-01"), by = "years")
##  [1] "1989-01-02" "1990-01-02" "1991-01-02" "1992-01-02" "1993-01-02"
##  [6] "1994-01-02" "1995-01-02" "1996-01-02" "1997-01-02" "1998-01-02"
## [11] "1999-01-02"

1年ごとのベクトルを任意の日付から任意の長さ(年数)で作る。

seq.Date(as.Date("1989-01-20"), by = "years", length.out = 12)
##  [1] "1989-01-20" "1990-01-20" "1991-01-20" "1992-01-20" "1993-01-20"
##  [6] "1994-01-20" "1995-01-20" "1996-01-20" "1997-01-20" "1998-01-20"
## [11] "1999-01-20" "2000-01-20"

1ヶ月ごとのベクトルを任意の日付(日付が1~28日)から任意の日付まで(始点基準)で作る。

seq.Date(as.Date("1989-01-01"), as.Date("1989-12-31"), by = "month")
##  [1] "1989-01-01" "1989-02-01" "1989-03-01" "1989-04-01" "1989-05-01"
##  [6] "1989-06-01" "1989-07-01" "1989-08-01" "1989-09-01" "1989-10-01"
## [11] "1989-11-01" "1989-12-01"

1ヶ月ごとのベクトルを任意の日付(日付が1~28日)から任意の長さ(月数)で作る。

seq.Date(as.Date("1989-01-01"), by = "month", length.out = 12)
##  [1] "1989-01-01" "1989-02-01" "1989-03-01" "1989-04-01" "1989-05-01"
##  [6] "1989-06-01" "1989-07-01" "1989-08-01" "1989-09-01" "1989-10-01"
## [11] "1989-11-01" "1989-12-01"

29日以降の日付ではうまく行かない。

seq.Date(as.Date("1989-01-31"), by = "month", length.out = 12)
##  [1] "1989-01-31" "1989-03-03" "1989-03-31" "1989-05-01" "1989-05-31"
##  [6] "1989-07-01" "1989-07-31" "1989-08-31" "1989-10-01" "1989-10-31"
## [11] "1989-12-01" "1989-12-31"

29~31日はない月ので月の日数を足すと月を超えてしまうところが出てきておかしくなるのは仕方がない。

月末の日付がほしかったら、次の月の月頭の日付を入れて-1するか、

seq.Date(as.Date("1989-02-01"), by = "month", length.out = 12) - 1
##  [1] "1989-01-31" "1989-02-28" "1989-03-31" "1989-04-30" "1989-05-31"
##  [6] "1989-06-30" "1989-07-31" "1989-08-31" "1989-09-30" "1989-10-31"
## [11] "1989-11-30" "1989-12-31"

月末を取り出すときに任意の日付でいきたければ、{lubridate}ceiling_date()を使って翌月の月頭を出して1引くのが楽?

lubridate::ceiling_date(seq.Date(as.Date("1989-01-20"), by = "month", length.out = 12), unit = "month") - 1
##  [1] "1989-01-31" "1989-02-28" "1989-03-31" "1989-04-30" "1989-05-31"
##  [6] "1989-06-30" "1989-07-31" "1989-08-31" "1989-09-30" "1989-10-31"
## [11] "1989-11-30" "1989-12-31"