概要
R(version3.3.2)にて、データ解析中に時刻データを経過時間に変換するのに苦労したので備忘録としてまとめます。
背景
RでCSVファイルを読み込んでデータ解析しているとき、開始時刻・終了時刻というカラムがありました。
開始時刻 | 終了時刻 |
---|---|
1:39 | 3:01 |
2:05 | 3:55 |
1:21 | 1:50 |
2:11 | 2:45 |
2:38 | 3:11 |
これらから下のテーブルの一番右のように経過時間を求めて追加する必要がありました。
開始時刻 | 終了時刻 | 経過時間(分) |
---|---|---|
1:39 | 3:01 | 82 |
2:05 | 3:55 | 110 |
1:21 | 1:50 | 29 |
2:11 | 2:45 | 34 |
2:38 | 3:11 | 33 |
しかし、開始時刻、終了時刻カラムはすべてCSVを読み込むとき時刻データとしてではなく、文字列として読み込まれており、単純に引き算で計算する事ができませんでした
対処
そこで、as.POSIXlt関数を用いて文字列として扱われている開始時刻・終了時刻を時刻データの1つであるPOSIXltに変換しました。上のデータフレームの名前をdとする時、以下のように実行することで変換ができました。
start.time <- c("1:39", "2:05", "1:21", "2:11", "2:38")
end.time <- c("3:01", "3:55", "1:50", "2:45", "3:11")
d <- cbind(start.time, end.time)
d
start.time end.time
[1,] "1:39" "3:01"
[2,] "2:05" "3:55"
[3,] "1:21" "1:50"
[4,] "2:11" "2:45"
[5,] "2:38" "3:11"
col1 <- as.POSIXlt(d[, 1], format="%H:%M")
col2 <- as.POSIXlt(d[, 2], format="%H:%M")
as.POSIXlt関数の引数formatで柔軟に変換ができるのが助かりますね!
POSIXltオブジェクトは$を使うことで日・時間・分など個別のデータを取り出すことができます。
> col1
[1] "2017-07-28 01:39:00 JST" "2017-07-28 02:05:00 JST" "2017-07-28 01:21:00 JST" "2017-07-28 02:11:00 JST"
[5] "2017-07-28 02:38:00 JST"
> col1$hour
[1] 1 2 1 2 2
> col1$min
[1] 39 5 21 11 38
この性質を利用して以下のようにすれば経過時間(分)を計算することができます。
> elapsed.time <- (col2$hour * 60 + col2$min) - (col1$hour * 60 + col1$min)
> elapsed.time
[1] 82 110 29 34 33
2017年8月2日追記
tayohei@githubさんから以下の経過時間の計算方法を教えていただきました。
こちらのほうが楽ですね!tayohei@githubさんありがとうございました!
> elapsed.time <- as.numeric(col2-col1, units="mins")
> elapsed.time
[1] 82 110 29 34 33
なお、今回の例ではないですが24時をまたぐ場合は補正が必要です。
for (i in 1:length(elapsed.time)) {
if (elapsed.time[i] < 0) {
elapsed.time[i] <- elapsed.time[i] + 60 * 24
}
}
最後に、cbindでデータフレームに追加すれば完成です!
> d <- cbind(d, "elapsed.time"=elapsed.time)
> d
start.time end.time elapsed.time
[1,] "1:39" "3:01" "82"
[2,] "2:05" "3:55" "110"
[3,] "1:21" "1:50" "29"
[4,] "2:11" "2:45" "34"
[5,] "2:38" "3:11" "33"
最後に
以上でRでas.POSIXlt関数を用いて時刻のデータをすべて経過時間に変換する方法の紹介を終わります。文字列を切り取る関数を使ってちまちま計算するスクリプトを書く必要があるかなぁと思っていたのでパパッと終わって助かりました。
ぜひ皆様のRライフの助けになれば幸いです。ここまでお読みいただきありがとうございました。