python-3.x 使用www.example.com索引为panda Dataframe 编制索引datetime.date会导致KeyError

anhgbhbe  于 2023-03-04  发布在  Python
关注(0)|答案(2)|浏览(108)

我从MySQL数据库中检索了一些数据。这些数据在一列中有日期(不是日期时间),在其他列中有一些其他随机数据。假设dtf是我的 Dataframe 。还没有索引,所以我设置了一个索引

dtf.set_index('date', inplace=True)

现在,我想获取特定日期的数据,因此我编写以下示例:

dtf.loc['2000-01-03']

或者只是

dtf['2000-01-03']

下面给出一个KeyError

KeyError: '2000-01-03'

但我知道它就在里面dtf.head()显示了这一点。
所以我看了一下第一行的索引类型:

type(dtf.index[0])

它告诉我:datetime.date。都好了。现在如果我输入

dtf.index

输出为

Index([2000-01-03, 2000-01-04, 2000-01-05, 2000-01-06, 2000-01-07, 2000-01-10,
       2000-01-11, 2000-01-12, 2000-01-13, 2000-01-14,
       ...
       2015-09-09, 2015-09-10, 2015-09-11, 2015-09-14, 2015-09-15, 2015-09-16,
       2015-09-17, 2015-09-18, 2015-09-21, 2015-09-22],
       dtype='object', name='date', length=2763)

我对dtype='object'有点困惑,这不是应该读作datetime.date吗?
如果我在mysql表中使用datetime而不是date,那么一切都很顺利。这是一个bug还是一个特性?我真的很想使用datetime.date,因为它最好地描述了我的数据。
我的Pandas版本是0.17.0
我使用的是python 3.5.0
我的操作系统是arch linux

3htmauhk

3htmauhk1#

您应该使用datetime 64/时间戳,而不是datetime。datetime:

dtf.index = pd.to_datetime(dtf.index)

这意味着你有一个DatetimeIndex,可以做一些漂亮的事情,比如通过字符串来锁定。

dtf.loc['2000-01-03']
  • 你不能用datetime. datetime *
ohfgkhjo

ohfgkhjo2#

使用pd.to_datetimedf.index转换为dtype datetime64时,每个索引的类型实际上都变为类型datetime.datetime

import datetime
# sample data
df = pd.DataFrame({'A': range(5)}, index=pd.date_range('2000-01-01','2000-01-05', 5).date) 

df.index = pd.to_datetime(df.index)
isinstance(df.index[0], datetime.datetime)       # True

正如Andy Hayden所提到的,一旦将索引转换为datetime64,就可以按照OP的要求建立索引,例如

df.loc['2000-01-03']
# or for range of dates
df.loc['2000-01-03':'2000-01-05']

此外,即使dtype是datetime64,空时间也不会呈现,所以从视觉上看,它们是完全相同的。
也就是说,如果要使用datetime.date,仍然可以显式使用datetime.date。例如,要选择2000-01-03上的值,可以使用locquery

df = pd.DataFrame({'A': range(5)}, index=pd.date_range('2000-01-01','2000-01-05', 5).date) 

df.loc[datetime.date(2000, 1, 3)]
# or
df.query("index == @datetime.date(2000, 1, 3)")

如果你需要在日期之间选择一个日期范围,query非常方便(或者between也可以):

date1 = datetime.date(2000, 1, 3)
date2 = datetime.date(2000, 1, 5)

df.query("@date1 <= index <= @date2")
# or
df[df.index.to_series().between(date1, date2)]

相关问题