概要
- Rの日付・時間周りの操作で便利なlubridateパッケージがよく使われるが、実際その速度ってどうなのか調べてみた
- というか、上司が調べてた。ので、それを私の方でまとめた。
- 結果としては、lubridateを使わない方が速かった。
データの準備
> days <- seq(as.POSIXct("2000-1-1 00:00:00"),len=365*24*10, by="1 hour")
> head(days, n=3)
[1] "2000-01-01 00:00:00 JST" "2000-01-01 01:00:00 JST" "2000-01-01 02:00:00 JST"
> tail(days, n=3)
[1] "2009-12-28 21:00:00 JST" "2009-12-28 22:00:00 JST" "2009-12-28 23:00:00 JST"
例:年月日に丸め変換
lubridateを使うパターン
> system.time(day <- floor_date(days, "day"))
user system elapsed
0.292 0.047 0.346
> head(day, n=3)
[1] "2000-01-01 JST" "2000-01-01 JST" "2000-01-01 JST"
lubridateを使わないバターン
> system.time(day <- as.POSIXct(trunc(days, 'days')))
user system elapsed
0.065 0.003 0.070
> head(day, n=3)
[1] "2000-01-01 JST" "2000-01-01 JST" "2000-01-01 JST"
思ってたより差があった。
例:時間(hour)の抽出
lubridateを使うパターン
> system.time(hours <- hour(days))
user system elapsed
0.058 0.002 0.061
> head(hours, n=3)
[1] 0 1 2
lubridateを使わないバターン
> system.time(hours <- as.integer(as.POSIXlt(days)$hour))
user system elapsed
0.029 0.005 0.034
> head(hours, n=3)
[1] 0 1 2
少しの差だが、使わないパターンの方が速い。
まとめ
- 数十万単位のベクトルでは、さらに差が広がった。
- ただし、可読性という点では、lubridateはとても良いと思う。
- 速度を気にするなら、使わないパターンもおさせておくと良いかも。
- ちなみに、自社の分析チームでは、可読性向上のため、独自の日付・時間操作関数を独自パッケージで運用している。