lubridate::ymdでAll formats failed to parseに遭遇
珍しいケースに遭遇したので、ちょっと調べたことをメモします。
日付列にほんの一部だけが日付のような文字列が入っていて、その他ほとんどがNA
が入っている数十万レコードのデータを渡されました。文字列型ではなく、 日付型として扱おうと、lubridate::ymd
を用いたら、All formats failed to parse
に遭遇しました。
調べてみると、parse_date_time
(その派生のymd
、ymd_hms
など)は最大501個のデータから疎推定で日付フォーマットを判定しているようでした。
lubridate.tidyverse.org
501個が判定できないフォーマットであると、全てパース失敗となるようです。
日付フォーマットが確実に分かっている場合には、フォーマットを指定した上でparse_date_time
の引数exact = TRUE
とするか、parse_date_time2
を用いる必要があります。
素数を使って選び出すthe best irregular guesser I could come up withな実装はここに書かれています。
lubridate/constants.r at master · tidyverse/lubridate · GitHub github.com