lubridate 1.5.0のアップデート内容を見てたら、こんなことが書いてありました。
#326 Added
exact = TRUE
option toparse_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も仲間入りしたわけですが、誰か試してみたひとは記事をよろしくお願いします。