- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
{{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]