Posted at

R で文字列を POSIX time に変換するには lubridate::parse_date_time2() がやっぱりちょっぱや

More than 3 years have passed since last update.

lubridate 1.5.0のアップデート内容を見てたら、こんなことが書いてありました。


#326 Added exact = TRUE option to parse_date_time for faster and much more flexible specification of formats.


で、そういえばこんな論争があったのを思い出しました。

R で文字列を POSIX time に変換するには lubridate::parse_date_time2() がちょっぱや

readr::parse_datetimeは組み込み関数より速いがfast_strptimeより遅い

やってみました。

dates <- as.POSIXlt("2014-12-01", tz="Japan") + sample(seq(31*24*60*60)-1, size=100, replace=TRUE)

dates <- as.character(dates)

format <- "%Y-%m-%d %H:%M:%S"
format2 <- "YmdHMS"

microbenchmark(
strptime(dates, format),
as.POSIXlt(dates),
as.POSIXct(dates),
lubridate::fast_strptime(dates, format),
lubridate::parse_date_time(dates, format, locale="C"),
lubridate::parse_date_time(dates, format, exact = TRUE), # new!
lubridate::parse_date_time2(dates, format),
lubridate::parse_date_time2(dates, format2, exact = TRUE), # new!
readr::parse_datetime(dates, format)
)

#> Unit: microseconds
#> expr min lq mean median uq max neval
#> strptime(dates, format) 1067.984 1115.0750 1195.53292 1136.2055 1151.2985 2862.849 100
#> as.POSIXlt(dates) 3332.545 3378.4285 3706.03166 3409.8215 3453.8935 8359.133 100
#> as.POSIXct(dates) 4378.192 4428.6020 4697.42747 4461.5050 4523.3865 10673.198 100
#> lubridate::fast_strptime(dates, format) 53.128 63.3915 80.44661 71.8430 91.7665 213.114 100
#> lubridate::parse_date_time(dates, format, locale = "C") 2547.103 2672.0735 3081.57806 2769.5750 2813.3445 7715.565 100
#> lubridate::parse_date_time(dates, format, exact = TRUE) 423.814 442.2270 533.67875 505.9195 553.9155 1125.941 100
#> lubridate::parse_date_time2(dates, format) 88.144 103.8410 132.62035 114.1040 147.6105 275.298 100
#> lubridate::parse_date_time2(dates, format2, exact = TRUE) 50.713 63.3920 78.89513 70.3350 90.2570 201.643 100
#> readr::parse_datetime(dates, format) 42902.889 43343.3035 44310.82814 43587.2070 44042.7155 69498.042 100

exact=TRUEをつけると、頭一つの差でlubridate::parse_date_time2()が返り咲いています! Congrats!

...まあわずかな差なんだしどうでもいいのでは、という気はします。この記事もきっと瞬く間に陳腐化することでしょう。備えよう。

ちなみに注意点としては、parse_date_time2()が想定しているのは%なしのフォーマットです。「あれ? exact=TRUEを付けたらエラーになる...」みたいな時は、"%Y-%m-%d %H:%M:%S"みたいなフォーマットを間違って指定していないか確認してみましょう。

ちなみにこの仁義なきスピード競争に最近RcppCCTZも仲間入りしたわけですが、誰か試してみたひとは記事をよろしくお願いします。