概要
pandasで日付データを読み込むとき、どのようなフォーマットだったら自動的に認識されるのか、それ以外のフォーマットの場合にどうした良いかを簡単に整理します。
自動認識フォーマット
pandasのマニュアルを見ると、自動で認識できるファイルフォーマットは以下のとのこと。
年と日時はある程度バリエーションが許容されますが、時間に関しては(時間:分:秒)と、コロンで区切られていなければいけないようです。
動作確認
年月日のみで検証
具体的に試してみましょう。元データとして以下のデータを用意しておきます。
Date Time Time2 Value 0 20150101 125736 10:10:10 1 1 20150101 153455 11:10:10 2 2 20150102 224355 12:10:10 3 3 20150222 112545 13:10:10 4
Dateは年月日を8桁整数で、TimeとTime2は時間を表しており、Timeはpandasが認識できないフォーマット、Time2はpandasが認識できるフォーマットです。Valueは適当な値です。
ここで、前回記事(Pandasのread_csvの全引数を解説)を参考に、parse_datesを指定して、正しく日付として認識できるかを試してみます。
#まずはDateのみを認識させる。 df = pd.read_csv('Daytest.csv', parse_dates=['Date'], index_col=0) Out: Time Time2 Value Date 2015-01-01 125736 10:10:10 1 2015-01-01 153455 11:10:10 2 2015-01-02 224355 12:10:10 3 2015-02-22 112545 13:10:10 4
どうやら正しく読み込まれていそうです。グラフを書いて確認してみましょう。横軸が年月日になっていれば成功です。
df['Value'].plot()
予想通り、問題ありません。
年月日+時間で検証(フォーマット合致)
次に、時間と組み合わせていきます。まずは合致している方から。
#DateとTime2を使用。 df = pd.read_csv('Daytest.csv', parse_dates=[['Date', 'Time2']], index_col=0) Out: Time Value Date_Time2 2015-01-01 10:10:10 125736 1 2015-01-01 11:10:10 153455 2 2015-01-02 12:10:10 224355 3 2015-02-22 13:10:10 112545 4
これもグラフ化してみましょう。横軸が年月日になっていれば成功です。
上の例とほとんど同じで分かりにくいですが、横軸がDate_Time2となっており、時間軸になっているので成功です。
年月日+時間で検証(フォーマット不合致)
次に、フォーマットが合致していないケース。
#DateとTimeを使用。 df = pd.read_csv('Daytest.csv', parse_dates=[['Date', 'Time']], index_col=0) Out: Time2 Value Date_Time 2015-01-01 12:57:36 10:10:10 1 2015-01-01 15:34:55 11:10:10 2 2015-01-02 22:43:55 12:10:10 3 2015-02-22 11:25:45 13:10:10 4
これも認識できていますね。確認のためグラフ化してみます。
コロンがなくても認識できるようです。
後書き
全てのケースがうまくいくという、なんとも微妙な結果になってしまいました。実はこの記事を書き始めた時は、3つ目のケース(フォーマット不合致)の時、うまく読み込めず、その対策を試行錯誤していたのですが、記事を書いている途中に、原因は秒にありえない値(96秒とか)が入っていたためだと気づき、直したところ問題なく動いたという状況だったりします^^。逆に言うと、空欄行があったり、正しくない値があるとうまくいかないということなので、うまくいかない方はこの辺りを中心にデータチェックしてみるといいかもしれません。