【Pandas】DataFrameの列が日付型かどうかを判定する
Pythonでの日付の扱いは慣れないとややこしいが、PandasのDataFrameやSeriesでの日付の扱いも慣れないとややこしい。
DataFrameやSeriesの場合、見た目は日付型っぽく見えても型はただの文字列(Object)だったりするので、見た目だけで判断していると思わぬところでエラーが発生する。
列が日付型かの判定方法を説明する。
DataFrameの列が日付型か判定
api.types.is_datetime64_dtypeでdatetime64か判定を行う。
データ作成
1date1 = ["2020-01-01", "2020-02-02", "2020-03-03", "2020-04-04"]
2date2 = ["2020-01-01", "2020-02-02", "2020-03-03", "2020-04-04"]
3
4df_date = pd.DataFrame(data={"date1": date1,
5 "date2": date2})
6df_date["date1"] = pd.to_datetime(df_date["date1"])
7
8print(df_date)
9# date1 date2
10# 0 2020-01-01 2020-01-01
11# 1 2020-02-02 2020-02-02
12# 2 2020-03-03 2020-03-03
13# 3 2020-04-04 2020-04-04
14
15print(f"{df_date.dtypes=}")
16# df_date.dtypes=date1 datetime64[ns]
17# date2 object
18# dtype: object
printしただけだとdate1もdate2も見た目は同じ。
しかし型を見ると、date1はdatetime64[ns]でdate2はobjectなので、全く異なる。
is_datetime64_dtypeで型判定
1# datetime64なのでTrue
2pd.api.types.is_datetime64_dtype(df_date["date1"])
3# True
4
5# ObjectなのでFalse
6pd.api.types.is_datetime64_dtype(df_date["date2"])
7# False
8
9# 1次元ではないのでFalse
10pd.api.types.is_datetime64_dtype(df_date)
11# False
上記の例では日付objectをdatetime64に変換してから型判定をしたが、型がdatetime64であればTrueになる。
1# datetime64
2pd.api.types.is_datetime64_dtype(np.datetime64)
3# True
4
5# datetime64[ns]の1次元配列(要素なし)
6pd.api.types.is_datetime64_dtype(np.array([], dtype="datetime64[ns]"))
7# True
8
9# DatetimeIndex(要素なし)
10pd.api.types.is_datetime64_dtype(pd.DatetimeIndex([], dtype="datetime64[ns]"))
11# True
datetime64, datetime64[ns]は基本的にTrue判定されるが、timezoneを指定するとFalseとなる。
1# timezoneを指定したdatetime64[ns]
2pd.DatetimeTZDtype(tz="UTC")
3# datetime64[ns, UTC]
4
5# timezone指定はFalse
6pd.api.types.is_datetime64_dtype(pd.DatetimeTZDtype(tz="UTC"))
7# False
公式にも判定可能な内容が分かりやすく記載されている。
timezone指定可能か、datetime64かdatetime64[ns]かなどの判定結果が異なるis_datetime64が色々とある。
色々なis_datetime64
is_datetime64には色々な種類がある。
is_datetime64_any_dtype
timezoneを指定したdatetime64もTrueとなる。それ以外はis_datetime64_dtypeと同じ。
1# datetime64[ns]はTrue
2pd.api.types.is_datetime64_any_dtype(df_date["date1"])
3# True
4
5# objectはFalse
6pd.api.types.is_datetime64_any_dtype(df_date["date2"])
7# False
8
9# datetime64はTrue
10pd.api.types.is_datetime64_any_dtype(np.datetime64)
11# True
12
13# timezone指定もTrue
14pd.api.types.is_datetime64_any_dtype(pd.DatetimeTZDtype(tz="EST"))
15# True
公式にも分かりやすく例が記載されている。
is_datetime64_ns_dtype
datetime64はFalseとなる。datetime64[ns, tz]はTrueとなる。
1# datetime64[ns]はTrue
2pd.api.types.is_datetime64_ns_dtype(df_date["date1"])
3# True
4
5# objectはFalse
6pd.api.types.is_datetime64_ns_dtype(df_date["date2"])
7# False
8
9# datetime[ns, tz]はTrue
10pd.api.types.is_datetime64_ns_dtype(pd.DatetimeTZDtype(tz="EST"))
11# True
12
13# datetimeはFalse
14pd.api.types.is_datetime64_ns_dtype(np.datetime64())
15# False
公式にも分かりやすく例が記載されている。
is_datetime64tz_dtype
timezoneを指定しないとFalseになる。
1# datetime64[ns]はFalse
2pd.api.types.is_datetime64tz_dtype(df_date["date1"])
3# False
4
5# objectはFalse
6pd.api.types.is_datetime64tz_dtype(df_date["date2"])
7# False
8
9# datetime64[ns, tz]はTrue
10pd.api.types.is_datetime64tz_dtype(pd.DatetimeTZDtype(tz="EST"))
11# True
12
13# datetime64はFalse
14pd.api.types.is_datetime64tz_dtype(np.datetime64())
15# False
公式にも分かりやすく例が記載されている。
まとめ
判定したい内容に応じてis_datetime64_dtype系を使い分ける。
メソッド | datetime64[ns] | datetime64[ns, tz] | datetime |
---|---|---|---|
is_datetime64_dtype | True | False | True |
is_datetime64_any_dtype | True | True | True |
is_datetime64_ns_dtype | True | True | False |
is_datetime64tz_dtype | False | True | False |