{{category package}} ! パッケージの読み込み lubridate.packageは、tidyverseでは読み込まれないので、tidyverseのあとに明示的に読み込んでやる必要がある。 !日付から西暦年、月、日のみを読み取る lubridateパッケージを使うと、日付型から、年・月・日などのデータを読み取ることができる。 install.packages('lubridate') library(lubridate) d <- as.Date("2015-10-14") year(d) [1] 2015 month(d) [1] 10 day(d) [1] 14 week(d) [1] 41 lubridate::wday(d) #曜日の番号(日曜日が1) [1] 4 lubridate::wday(d, label = T) #曜日のラベルを取得する [1] 水 Levels: 日 < 月 < 火 < 水 < 木 < 金 < 土 さらに便利なのは、ymd()などの関数で文字列から日付型ができる。 > ymd("20151014") [1] "2015-10-14" > is.Date(ymd("20151014")) [1] TRUE > mdy("10-14-2015") [1] "2015-10-14" ! 月単位で集計する 会計データで多い月単位での集計は、month()でも可能だが、暦年がまたがったりすると、x1年12月とx2年1月が順番が入れ替わったりする不便さがある。 そこで、日付データを月初日に変換して集計する。 > lubridate::ymd("2020-11-03") %>% class() [1] "Date" > lubridate::ymd("2020-11-03") %>% lubridate::floor_date(unit = "month") [1] "2020-11-01" > lubridate::ymd("2020-11-03") %>% lubridate::ceiling_date(unit = "month") [1] "2020-12-01" この方法は、r-wakalangで@tnkkntさんに教わった。 :注意: floor_date()で生成されるのは数値型なので、月別に色塗りしようとすると、連続値のグラデーションになる。 だから月別にするためには、as.factor( floor_date(), "month") のように因子型にする。 ! 応答日と期間の違い 「一年後」を計算する際に、dyears(1)を使うと、法律で言う応答日とは違う日を指す可能性があるので、うるう年は注意。 > dyears(1) [1] "31557600s (~1 years)" > 31557600 / 3600 [1] 8766 > 31557600 / 3600 /24 [1] 365.25 > 31557600 / 3600 /25 [1] 350.64 > ymd("2020-03-10") - ymd("2019-03-10") Time difference of 366 days > ymd("2020-03-10") - ymd("2019-03-10") < dyears(1) [1] FALSE > ymd("2020-03-10") - ymd("2019-03-10") <= dyears(1) [1] FALSE > ymd("2020-04-10") - ymd("2019-04-10") <= dyears(1) [1] FALSE > ymd("2020-02-10") - ymd("2019-02-10") <= dyears(1) [1] TRUE > ymd("2020-02-10") - ymd("2019-02-10") < dyears(1) [1] TRUE > ymd("2020-03-10") - dyears(1) #うるう年の一年前は [1] "2019-03-10 18:00:00 UTC" #応答日を示す > ymd("2019-03-10") - dyears(1) #うるう年以外の一年前は [1] "2018-03-09 18:00:00 UTC" #応答日の一日前を示す > ymd("2020-03-10") + dyears(1) #うるう年の日を過ぎた一年後は [1] "2021-03-10 06:00:00 UTC" #応答日を指す > ymd("2019-03-10") + dyears(1) #間にうるう年を挟む一年後は [1] "2020-03-09 06:00:00 UTC" #応答日の一日前を指す periodsクラスであれば、 > ymd("2019-03-10") + years(1) #一年後の応答日を示す。 [1] "2020-03-10" 特に下の2つは注意 > ymd("2020-03-10") - ymd("2019-03-10") <= dyears(1) [1] FALSE > ymd("2020-03-10") - ymd("2019-03-10") <= years(1) [1] FALSE > ymd("2019-03-10") + years(1) [1] "2020-03-10" > ymd("2020-03-10") - ymd("2019-03-10") == years(1) [1] FALSE !月の応答日 月の応答日の場合、月末が31日とは限らない。その時、単純に;month(1)を足してもエラーになる。 ymd("2022/10/31") %m+% month(1) * https://community.rstudio.com/t/add-one-month-to-date-with-lubridate/47445 !!参考リンク *[lubridateパッケージ入門|https://qiita.com/nozma/items/01725761d980a0110027]