時系列データ

Rでの日時の表し方

Rで現在の日時を調べるにはつぎのようにする。

Sys.time()
[1] "2011-03-20 12:34:56 JST"

この形式がISOで決められた時間の表し方である。最後のJSTは日本標準時を表すが,自明なら "2011-03-20 12:34:56" のように省略してもよい。さらに秒が不要なら "2011-03-20 12:34" でよいし,日付だけでよければ "2011-03-20" でよい。

これらは文字列のように見えるが,内部表現は1970年元旦からの秒数で,POSIXct型という衣を着ている。衣(クラス)を剥がしてみれば,整数値が現れる。単に数値に変換しても同じ結果になる。

unclass(Sys.time())
[1] 1300592096
as.numeric(Sys.time())
[1] 1300592096

"2011-03-20 12:34:56" のような文字列からPOSIXct型の値に変換するには

t = as.POSIXct("2011-03-20 12:34:56")

のようにすればよい。"2011-03-20" の代わりに "2011-3-20" でも "2011/3/20" でも解釈してくれる。別の方法として次のようにもできる。

t = ISOdatetime(2011, 3, 20, 12, 34, 56)

POSIXct型は内部では秒単位の整数であるため,秒を加算することができる。例えば時刻 t を起点として10分ごと1時間の数列を作るには次のようにする(最後の 600"10 min" でもよい)。

seq(t, t+3600, 600)

ちなみに,日本の環境では日時は日本標準時(JST)で扱われる。これは協定世界時(UTC)から9時間(32400秒)ずれている:

as.numeric(as.POSIXct("1970-01-01 00:00:00"))
[1] -32400
as.numeric(as.POSIXct("1970-01-01 00:00:00", tz="Asia/Tokyo"))
[1] -32400
as.numeric(as.POSIXct("1970-01-01 00:00:00", tz="UTC"))
[1] 0

POSIXct型以外にPOSIXlt型がある。これは年月日時分秒をリストとして並べたものである。

日時を表す文字列をPOSIXct型に変換する際に,まず strptime() によりPOSIXlt型に変換される。ここでシステムコールが発生し,遅い。より速く変換するには fasttime パッケージを使う(datatable 参照)。

日単位ならDate型を使う。これは内部的には1970-01-01からの日数である。as.numeric(as.Date("1970-01-01")) の値は0になる。

簡単な時系列グラフ

ここまでのまとめとして,簡単な時系列データのグラフを描いてみよう。文科省が都道府県別環境放射能水準調査結果[リンク切れ]で公開している福島第一原発の事故に伴う3月15日17-18時から1時間ごとの東京都新宿区で計測した放射線の量は次の通りである。

x = c(0.0941, 0.2, 0.361, 0.123, 0.0888, 0.0657, 0.0556)

このグラフは次のようにして描ける。

t0 = as.POSIXct("2011-03-15 17:00")
t = seq(t0, by=3600, along.with=x)
plot(t, x, type="o", pch=16, xlab="時刻", ylab="γ線(μSv/h)")

もっとデータを増やしてみよう。

x = c(0.0941, 0.2, 0.361, 0.123, 0.0888, 0.0657,
      0.0556, 0.0538, 0.0547, 0.0672, 0.101, 0.141,
      0.143, 0.142, 0.104, 0.0891, 0.069, 0.058,
      0.057, 0.056, 0.055, 0.054, 0.054, 0.054)

これくらいになると,時間軸の目盛りが思うようにならない。目盛りを省略(xaxt="n")して,別に目盛りだけを描くほうがよい。

plot(t, x, type="o", pch=16, xlab="時刻", ylab="γ線(μSv/h)", xaxt="n")
axis.POSIXct(1, at=t, format="%d日%H時")

目盛りを4時間ごとにしてみよう。

plot(t, x, type="o", pch=16, xlab="時刻", ylab="γ線(μSv/h)", xaxt="n")
r = as.POSIXct(round(range(t), "hours"))
axis.POSIXct(1, at=seq(r[1],r[2],by="4 hours"), format="%d日%H時")

このように,POSIXct型では sec(s)min(s)hour(s)day(s) という単位が使える。また,format の形式はRで strptime のヘルプを見れば出ている。よく使うものだけを挙げておく:

%Y年(4桁)
%y年(2桁)
%m月(01-12)
%b月( 1-12←日本語環境では)
%d日(01-31)
%e日( 1-31)
%H時(00-23)
%M分(00-59)
%S秒(00-61)

Last modified: