首页 > 解决方案 > 如何在 DatetimeIndex 中禁止除时间戳以外的键?

问题描述

Pandas 不将 DatetimeIndex 键限制为仅时间戳。为什么会这样,有没有办法做出这样的限制?

df = pd.DataFrame({"A":{"2019-01-01":12.0,"2019-01-03":27.0,"2019-01-04":15.0},
                   "B":{"2019-01-01":25.0,"2019-01-03":27.0,"2019-01-04":27.0}}
                 )
df.index = pd.to_datetime(df.index)
df.loc['2010-05-05'] = 1 # string index
df.loc[150] = 1 # integer index
print(df)

我得到以下数据框:

                        A     B
2019-01-01 00:00:00  12.0  25.0
2019-01-03 00:00:00  27.0  27.0
2019-01-04 00:00:00  15.0  27.0
2010-05-05            1.0   1.0
150                   1.0   1.0

我当然做不到

df.index = pd.to_datetime(df.index)

再次因为最后两行。但是,如果无法添加最后 2 行并引发错误,我想。可能吗?

标签: pythonpandasdatetimeindex

解决方案


您对您的index. 它不是DateTimeIndex:_

>>> df.index
Index([2019-01-01 00:00:00, 2019-01-03 00:00:00, 2019-01-04 00:00:00,
              '2010-05-05',                 150],
      dtype='object')

Object一旦添加了不同的类型值, 该索引就会成为dtype 索引。DateTimeIndex的类型不能超过时间戳,索引的类型会改变。


如果您想从索引中删除所有不是日期时间的值,您可以使用pd.to_datetimeanderrors='coerce'

df.index = pd.to_datetime(df.index, errors='coerce')

               A     B
2019-01-01  12.0  25.0
2019-01-03  27.0  27.0
2019-01-04  15.0  27.0
2010-05-05   1.0   1.0
NaT          1.0   1.0

要仅访问具有有效Timestampas 索引的元素,您可以使用notnull

df[df.index.notnull()]

               A     B
2019-01-01  12.0  25.0
2019-01-03  27.0  27.0
2019-01-04  15.0  27.0
2010-05-05   1.0   1.0

推荐阅读