使用 pandas' 时,我得到了相当意外的行为pd.to_datetime
。我pd.Series
的如下:
0 2017-01-06 14:37:16
1 2017-01-27 00:00:00
2 2017-01-18 00:00:00
3 2017-01-26 00:00:00
4 None
...
454823 2019-10-22 11:20:03
454824 None
454825 2019-07-11 00:00:00
454826 None
454827 2019-07-15 00:00:00
Name: colx, Length: 454828, dtype: object
Run Code Online (Sandbox Code Playgroud)
当投射到datetime
我得到:
pd.to_datetime(df.colx, errors='coerce')
Run Code Online (Sandbox Code Playgroud)
InvalidIndexError:重新索引仅对唯一值的索引对象有效
虽然这似乎表明索引中存在重复值,但我运行了以下测试来检查这是否是原因:
all(df.colx.index == range(df.colx.shape[0]))
# True
df.index.duplicated().any()
# False
Run Code Online (Sandbox Code Playgroud)
所以显然没有任何重复的索引。什么可能导致此错误?
ALo*_*llz 15
您收到的错误与您的Index
. 它与本应从0.25.0
. 该问题与以下null
使用时对多种类型的不一致处理有关pd.to_datetime
import pandas as pd
pd.core.algorithms.unique([pd.NaT, None])
#array([NaT, None], dtype=object) # That is, `pd.NaT` and `None` are unique
pd.Index([pd.NaT, None]).is_unique
#False # However, Index.unique considers them duplicated
Run Code Online (Sandbox Code Playgroud)
这种不同行为的处理应该已经修复了0.25.0
。如果它仍然给您带来问题,解决方案是确保您在需要转换的列中具有单一的null
值表示。在这种情况下,您可以.fillna
使用 datetime 空值。
pd.to_datetime(df.colx.fillna(pd.NaT), errors='coerce')
Run Code Online (Sandbox Code Playgroud)
pd.__version__
#'0.25.0'
pd.to_datetime([pd.NaT, None])
#DatetimeIndex(['NaT', 'NaT'], dtype='datetime64[ns]', freq=None)
Run Code Online (Sandbox Code Playgroud)