Kuroyagi飼育日誌

学んだことの備忘録

PandasのDataframeにおける変換の罠

Dataframeで日付データをdatetime64のフォーマット処理する際に引っかかったことの備忘録。

エクセルファイルの日付データをPandasに取り込んだ際にdatetime64形式だと便利なので今まで下記で変換していた。

pd.to_datetime(df ,format='%Y-%M-%D %H:%M:%S')

大半の列については処理できたが、いくつかの列で下記エラーが出て処理できなかった。

Reindexing only valid with uniquely valued Index objects

処理できる列と出来ない列を見比べてみると、以下の通り

【処理できる列】

0       2019-10-08 00:00:00
1       2019-10-08 00:00:00
2       2019-10-08 00:00:00
3       2019-10-08 00:00:00
4       2019-10-08 00:00:00
5       2019-10-08 00:00:00
6       2019-10-08 00:00:00
7       2019-10-08 00:00:00
8       2019-10-08 00:00:00
9       2019-10-08 00:00:00
10      2019-10-08 00:00:00
11      2019-10-08 00:00:00
12      2019-10-08 00:00:00
13      2019-10-08 00:00:00
14      2019-10-08 00:00:00
15      2019-10-08 00:00:00
16      2019-10-08 00:00:00
17      2019-10-08 00:00:00
18                     None
19                     None
20                     None
21                     None
22                     None
23                     None
24                     None
25                     None
26                     None
27      2019-10-22 00:00:00
28      2019-10-22 00:00:00
29      2019-10-22 00:00:00

【処理できない列】

0       2019-10-08 00:00:00
1       2019-10-08 00:00:00
2       2019-10-08 00:00:00
3       2019-10-08 00:00:00
4       2019-10-08 00:00:00
5       2019-10-08 00:00:00
6       2019-10-08 00:00:00
7       2019-10-08 00:00:00
8       2019-10-08 00:00:00
9       2019-10-08 00:00:00
10      2019-10-08 00:00:00
11      2019-10-08 00:00:00
12      2019-10-08 00:00:00
13      2019-10-08 00:00:00
14      2019-10-08 00:00:00
15      2019-10-08 00:00:00
16      2019-10-08 00:00:00
17      2019-10-08 00:00:00
18                      NaN
19                      NaN
20                      NaN
21                      NaN
22                      NaN
23                      NaN
24                      NaN
25                      NaN
26                      NaN
27      2019-10-22 00:00:00
28      2019-12-16 00:00:00
29      2019-10-22 00:00:00


どうやら空白行がNoneだと処理できて、Nanだと処理できない様子。とりあえず前処理でNanをNoneに置換する以下を導入。

df.where(df.notna(), None)

無事に変換できるようになりました。