トップ 一覧 検索 ヘルプ RSS ログイン 印刷

lubridateの変更点

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