LoginSignup
3
4

More than 5 years have passed since last update.

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

Posted at

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も仲間入りしたわけですが、誰か試してみたひとは記事をよろしくお願いします。

3
4
0

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
3
4