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行则抛出错误。 有可能吗?
答案 0 :(得分:1)
您对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_datetime
和errors='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
要仅访问具有有效Timestamp
作为索引的元素,可以使用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
答案 1 :(得分:0)
您可以检查每个索引是否为pd._libs.tslibs.timestamps.Timestamp
实例:
flags = [isinstance(idx, pd._libs.tslibs.timestamps.Timestamp) for idx in df.reset_index()['index']]
df = df[flags]
但是,请注意,您当然可以同时进行pd.to_datetime('2010-05-05')
和pd.to_datetime(150)
。至少,它们仍然会产生有效的日期时间戳,而不会引发异常/错误/