# R は月日や時間を特別な方法で表します。
# 月日は、'Date’classで表示され、時間は、'POSIXct’と’POSIXlt' classで表示されます。
# 月日は、1970-01-01からの日数で保持され、時間は、'POSIXct’classでは1970-01-01 からの秒数、あるいは、'POSIXlt’class の場合、seconds, minutes, hoursなどのlistで保持されます。
# まず、Sys.Date()についてチェックします。
d1 <- Sys.Date()
# 関数class() をd1 に適用します。
class(d1)
## [1] "Date"
# オブジェクトの型は、”Date”であることが確認できました。
# 今度は関数unclass()を適用します。
unclass(d1)
## [1] 16605
# この結果は、1970-01-01からの日数を示しています。
# つまり、先ほど説明した「月日は、1970-01-01からの日数で保持され」のことを表しています。
# しかし、d1 を表示させると、YEAR-MONTH-DAYの形式で表示されます。
d1
## [1] "2015-06-19"
# では、1970-01-01以前についてはどうすればいいのでしょうか。
# as.Date("1969-01-01”)を 変数 d2 に代入します。
d2 <- as.Date("1969-01-01")
# d2 に対して関数unclass()を適用します。
unclass(d2)
## [1] -365
# 1969-01-01は1970-01-01の365日前なので、-365が結果となっています。
# 関数Sys.time() は今の時間を取り出します。
t1 <- Sys.time()
# t1 を表示します。
t1
## [1] "2015-06-19 16:55:56 JST"
# 関数class()をt1に適用します。
class(t1)
## [1] "POSIXct" "POSIXt"
# "POSIXct" は先ほど説明した「時間は、'POSIXct’classでは1970-01-01 からの秒数、」になります。”POSIXt”についてはここでは無視します。
# t1 に関数unclass()を適用すると、今度は日数ではなく秒数が表示されます。
unclass(t1)
## [1] 1434700557
# 関数 Sys.time() は ‘POSIXct’で値を返しますが、関数 as.POSIXlt()を使って強制的に‘POSIXlt’に変換します。
t2 <- as.POSIXlt(Sys.time())
# t2のclassをチェックします。
class(t2)
## [1] "POSIXlt" "POSIXt"
# t2を表示します。
t2
## [1] "2015-06-19 16:55:56 JST"
# t2の表示と、t1の表示は同じであることが確認できました。
# unclass()をt2に適用してみます。
unclass(t2)
## $sec
## [1] 56.56653
##
## $min
## [1] 55
##
## $hour
## [1] 16
##
## $mday
## [1] 19
##
## $mon
## [1] 5
##
## $year
## [1] 115
##
## $wday
## [1] 5
##
## $yday
## [1] 169
##
## $isdst
## [1] 0
##
## $zone
## [1] "JST"
##
## $gmtoff
## [1] 32400
##
## attr(,"tzone")
## [1] "" "JST" "JDT"
# t2は‘POSIXlt’型であり、月日や時間を構成する値のリストであることが確認できました。
# 今度は関数str()を使って、もう少し見やすい形で表示させます。
str(unclass(t2))
## List of 11
## $ sec : num 56.6
## $ min : int 55
## $ hour : int 16
## $ mday : int 19
## $ mon : int 5
## $ year : int 115
## $ wday : int 5
## $ yday : int 169
## $ isdst : int 0
## $ zone : chr "JST"
## $ gmtoff: int 32400
## - attr(*, "tzone")= chr [1:3] "" "JST" "JDT"
# ここまでで、時間に関する3つのオブジェクトの型、'Date’、’POSIXct’および ’POSIXlt’について確認しました。
# d1に対して関数weekdays()を適用します。
weekdays(d1)
## [1] "金曜日"
# 次に、t1 に対して関数months()を適用します。
months(t1)
## [1] "6月"
# 四半期についての情報も得ることができます。
quarters(t2)
## [1] "Q2"
# 次に、任意の時間をRに代入することを説明します。
# まず、"20150619, 08:24" を変数t3に代入します。
t3 <- "20150619, 08:24"
# t4 <- strptime(t3,"%Y%m%d, %H:%M") を実行することで、文字型データをRが理解できる日時型データに変換します。
t4 <- strptime(t3,"%Y%m%d, %H:%M")
# t4を表示します。
t4
## [1] "2015-06-19 08:24:00 JST"
# 関数class()で、t4の型を確認します。
class(t4)
## [1] "POSIXlt" "POSIXt"
# 最後の説明は、これら時間に対して、算術演算子(+, - など)、論理演算子(<, ==など)が適用できることです。
# 変数t1には、このレッスンの最初の時点の時間が代入れています。
Sys.time() > t1
## [1] TRUE
# 最初の時点から時間が経過しているので、TRUEが得られています。
# 具体的にどれだけの時間が経過したのかを見てみます。
Sys.time() - t1
## Time difference of 0.03729415 secs
# 次のコードを実行してください。
difftime(Sys.time(), t1, units = 'secs')
## Time difference of 0.03914118 secs
# 関数difftime()を、変数t1に適用し、結果として返す値の単位に’secs’を指定しました。
# 例えば、秒はsecs、分はmins、日はdaysで指定します。
# これで時間についての説明は終わりです。