191  period(sld101)

library(tidyverse)
library(lubridate)

それでは、カレンダーの日付を変更するようなを計算していきましょう。

これ、実は簡単で、dyears、dmonthsではなくて、years、monthsという関数で処理をすれば実現できます。

months(1)
[1] "1m 0d 0H 0M 0S"

durationと違う表記ですね?

class(months(1))
[1] "Period"
attr(,"package")
[1] "lubridate"

このperiodクラスを日付に足していってみましょう。

dy1 <- as_date("2020-2-20")
dy2 <- dy1 + months(1)
dy3 <- dy2 + months(1)

きっちりカレンダーの数字を変更させただけですね。

ここでちょっと注目いただきたいのは、

as.numeric(dy3 - dy2)
[1] 31
as.numeric(dy2 - dy1)
[1] 29

months(1)は、「物理的な時間」を無視して単純に月の数字だけを増加させているという形になります。

duration、period、特徴を理解して適切な場面で使わないと、時刻・日付計算で予想しないようなエラーが生じる場面もありますので、是非、ここでなんとなくでもいいので違いを押さえておいてください。

periodを利用する場合の注意点として、架空の日付が生成される場合があることです。やってみましょう。

dy1 <- as_date("2020-01-31")

2020-1-31の1か月後という処理を行うつもりで、

dy1 + months(1)
[1] NA

とすると、NAとなります。

これは、 2020- 01- 31 +1 2020- 02- 31

という風に、2月31日という存在しない日付になってしまったからです。

このような場合だと、条件を考えて操作をしないといけないので結構てまです。

lubridateには、こういうケースでエラーが出ないようにするための+と-の特別な記号がlubridateに含まれており

dy1
[1] "2020-01-31"
dy1 + months(1)
[1] NA
dy1 %m+% months(1)
[1] "2020-02-29"
dy1 - months(2)
[1] NA
dy1 %m-% months(2)
[1] "2019-11-30"

こんな感じで計算することができます。

ということでPeriodの紹介でした。