サラリーマンエンジニアブログ

大企業で働くなんちゃってITエンジニアのブログです。

PythonのPandasにおけるdatetime型(datetime64[ns])の年月日制限

seigen
PythonのPandasは機械学習などのデータ分析をする場合の必須ライブラリですね。
そのPandasに関する「不満」です。

PandasのDateTime型(datetime64[ns])は1677年 ~ 2262年までしか対応していない

PandasのDateTime型で使用できる日付は1677年 ~ 2262年という制限があります。

ソースコードを見てみても書かれていますね。
f:id:yarite_parker:20190131215824p:plain
github.com

実際に動かしてみ他結果がこちらです。

>>> import pandas as pd
>>> from datetime import datetime as dt
>>>
>>> d = {'dt': ['2019-1-31 01:01:01', '1678-01-01 01:01:01','1677-01-01 01:01:01', '2262-01-01 01:01:01', '2263-01-01 01:01:01']}
>>> df = pd.DataFrame(data=d)
>>> pd.to_datetime(df['dt'], format='%Y-%m-%d %H:%M:%S', errors='coerce')
0   2019-01-31 01:01:01
1   1678-01-01 01:01:01
2                   NaT
3   2262-01-01 01:01:01
4                   NaT
Name: dt, dtype: datetime64[ns]
>>>

やはり 1677年 ~ 2262年という制限がありますね。


下記のようにPythonのDataframeではちゃんと処理することができます。

>>> import datetime
>>>
>>> print(datetime.datetime.strptime('2019-1-31 01:01:01', '%Y-%m-%d %H:%M:%S'))
2019-01-31 01:01:01
>>> print(datetime.datetime.strptime('1678-01-01 01:01:01', '%Y-%m-%d %H:%M:%S'))
1678-01-01 01:01:01
>>> print(datetime.datetime.strptime('1677-01-01 01:01:01', '%Y-%m-%d %H:%M:%S'))
1677-01-01 01:01:01
>>> print(datetime.datetime.strptime('1678-01-01 01:01:01', '%Y-%m-%d %H:%M:%S'))
1678-01-01 01:01:01
>>> print(datetime.datetime.strptime('2262-01-01 01:01:01', '%Y-%m-%d %H:%M:%S'))
2262-01-01 01:01:01
>>> print(datetime.datetime.strptime('2263-01-01 01:01:01', '%Y-%m-%d %H:%M:%S'))
2263-01-01 01:01:01
>>> print(datetime.datetime.strptime('0001-01-01 01:01:01', '%Y-%m-%d %H:%M:%S'))
0001-01-01 01:01:01


私の会社でのルールとして

  • 0001-01-01は入力不正なデータ
  • 0002-01-01はネットーワークに繋がってなくて日付が取れなかったデータ

など、日付に意味を持たせています。
それらをDatetime型に変換をすればエラーになるし、
errors='coerce' というオプションをつければ一律Noneになってしまうし....、
制限を外すオプションがあれば便利なのですが、今は無いですね。
従ってDatetime型に変換する前にもうひと処理を加えなければなりません。

非常にめんどくさい。
なんのためにこんな制限つけてるのかな...


まとめ

Pandasのdatetme型で使用できる、年月日は1677年 ~ 2262年