今週も特にありません

進捗どうですか?

lubridate::ymdでAll formats failed to parseに遭遇

珍しいケースに遭遇したので、ちょっと調べたことをメモします。

日付列にほんの一部だけが日付のような文字列が入っていて、その他ほとんどがNAが入っている数十万レコードのデータを渡されました。文字列型ではなく、 日付型として扱おうと、lubridate::ymdを用いたら、All formats failed to parseに遭遇しました。

調べてみると、parse_date_time(その派生のymdymd_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