トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン 印刷

lubridate

auditR

[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