[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)
Last updated 2020-11-22 | auditR (c) N.Nawata