Pandasで取り扱える日付データのフォーマット

概要

pandasで日付データを読み込むとき、どのようなフォーマットだったら自動的に認識されるのか、それ以外のフォーマットの場合にどうした良いかを簡単に整理します。

自動認識フォーマット

pandasのマニュアルを見ると、自動で認識できるファイルフォーマットは以下のとのこと。
f:id:Rosyuku:20151103215037p:plain
年と日時はある程度バリエーションが許容されますが、時間に関しては(時間:分:秒)と、コロンで区切られていなければいけないようです。

動作確認

年月日のみで検証

具体的に試してみましょう。元データとして以下のデータを用意しておきます。

       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()

f:id:Rosyuku:20151103220232p:plain
予想通り、問題ありません。

年月日+時間で検証(フォーマット合致)

次に、時間と組み合わせていきます。まずは合致している方から。

#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

これもグラフ化してみましょう。横軸が年月日になっていれば成功です。
f:id:Rosyuku:20151103221038p:plain
上の例とほとんど同じで分かりにくいですが、横軸が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

これも認識できていますね。確認のためグラフ化してみます。
f:id:Rosyuku:20151103221657p:plain
コロンがなくても認識できるようです。

後書き

全てのケースがうまくいくという、なんとも微妙な結果になってしまいました。実はこの記事を書き始めた時は、3つ目のケース(フォーマット不合致)の時、うまく読み込めず、その対策を試行錯誤していたのですが、記事を書いている途中に、原因は秒にありえない値(96秒とか)が入っていたためだと気づき、直したところ問題なく動いたという状況だったりします^^。逆に言うと、空欄行があったり、正しくない値があるとうまくいかないということなので、うまくいかない方はこの辺りを中心にデータチェックしてみるといいかもしれません。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA