7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rでas.POSIXlt関数を用いて時刻のデータをすべて経過時間に変換する

Last updated at Posted at 2017-07-28

概要

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を読み込むとき時刻データとしてではなく、文字列として読み込まれており、単純に引き算で計算する事ができませんでした:thinking:

対処

そこで、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オブジェクトは$を使うことで日・時間・分など個別のデータを取り出すことができます。

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さんありがとうございました!

経過時間を計算する(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ライフの助けになれば幸いです。ここまでお読みいただきありがとうございました。

7
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?