189  日付・時刻の計算(sld99)

library(tidyverse)
library(lubridate)

さて、ここまでで日付・時刻の基本的な知識はすべて解説したので、ここからは計算について解説していきます。   まず、ポイントとなるのは、日付・時刻同士は「引き算しかできない」となります。

d1 <- as_date(10)
d2 <- as_date(2000)

d1
[1] "1970-01-11"
d2
[1] "1975-06-24"

本当に引き算以外ができないか、確認してみましょう。

(時刻と時刻を足す、時刻と時刻をかける、時刻と時刻をわるという行為そのものの意味もよくわかりませんが、実験をするのは大事です)

d1 + d2
Error in `+.Date`(d1, d2): binary + is not defined for "Date" objects
d1 * d2
Error in Ops.Date(d1, d2): * not defined for "Date" objects
d1 / d2
Error in Ops.Date(d1, d2): / not defined for "Date" objects

できませんね?

で、日付の引き算をしてみましょう。

d2 - d1 #うまくいきました。
Time difference of 1990 days
minus <- d2-d1 #minusという変数にいれて
class(minus) #classを調べます。
[1] "difftime"

「Time difference of 10 days」

クラスは、difftimeというものになっています。

数字や文字に返還してみましょう。

as.numeric(minus)
[1] 1990
as.character(minus)
[1] "1990"

このように日数を表していますね。

このdifftime単純な日数差を計算するだけならこれでOKです

ただ時刻型では、

t1 <- as_datetime(0)
t2 <- as_datetime(1)
t3 <- as_datetime(65)
t4 <- as_datetime(3605)
t5 <- as_datetime((3600*24)+5)
t6 <- as_datetime(366*((3600*24))+5)

min21 <- t2-t1
min31 <- t3-t1
min41 <- t4-t1
min51 <- t5-t1
min61 <- t6-t1

min21
Time difference of 1 secs
min31
Time difference of 1.083333 mins
min41
Time difference of 1.001389 hours
min51
Time difference of 1.000058 days
min61
Time difference of 366.0001 days

difftimeというclassであることには変わりないのですが、表示される単位が最小で秒から最大で日まで代わり、数字に戻すと、

as.numeric(min21)
[1] 1
as.numeric(min31)
[1] 1.083333
as.numeric(min41)
[1] 1.001389
as.numeric(min51)
[1] 1.000058
as.numeric(min61)
[1] 366.0001

単位が違うままで印字されてしまいます。

これ、計算するときにものすごく困るので、次の動画では時間同士の引き算をより正確に計算する方法について解説していきます。