pd.to_datetime 产生“重新索引仅对唯一值的索引对象有效”

yat*_*atu 5 python pandas

使用 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)

  • 我有同样的问题。升级到当前最新的 Pandas 版本(1.1.2)没有帮助,但您在此处建议的解决方法确实为我解决了问题。我猜这个错误实际上并没有被修复或者出现了回归。 (2认同)
  • 这似乎仍然是一个悬而未决的问题。我刚刚在 Pandas 1.2.0 版本上遇到了问题。不过,用 pd.NaT 替换是有效的。感谢这里的解决方案。 (2认同)