将datetime分配为索引不会得到DatetimeIndex

时间:2018-12-07 23:16:49

标签: pandas datetimeindex

我的df有一个名为“天”的字段。我需要从“天”和开始日期创建日期时间。可能很麻烦,但可以:

for t in df.index:
    df.loc[t,'date']=datetime.date(startdate)+
    datetime.timedelta(days=df.loc[t,'days'])
df.index=df.date

当我尝试升采样时:

udf=df.resample('M',how='sum')

我得到:

  

TypeError:仅与DatetimeIndex,TimedeltaIndex或   PeriodIndex,但有一个“索引”的实例

如果我使用日期时间字段设置索引,为什么索引不成为日期时间索引(或“日期时间索引”)? “日期”中的每个条目和索引都是日期时间,不是吗?

type(df.date[0])
<type 'datetime.date'>

type(df.index[0])
<type 'datetime.date'>

解决方法是:

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

但是我找不到关于为什么将现有日期时间分配给索引不起作用的任何解释,但是通过pd.to_datetime(df.index)将现有日期时间(df.index)转换为日期时间的原因。

1 个答案:

答案 0 :(得分:0)

Pandas不会将python本机的datetime对象转换为可以创建Timestamp的{​​{1}}对象。阅读pandas.DatetimeIndex文档将有所帮助。

问题在于,在日期列中有datetimeindexs个对象不会创建熊猫datetime对象。熊猫Timestamp替代了Timestamp的熊猫

  

Timestamp与python的Datetime等效,并且在大多数情况下可以互换。此类型用于构成DatetimeIndex的条目以及熊猫中其他面向时间序列的数据结构。

查看pandas.Timestamp文档

datetime.datetime

退出:

df = pd.DataFrame(np.random.randn(10,4), columns = list('abcd')) # sample df
df.index = pd.date_range(start='2018-1-1', end='2018-1-10') # use pandas to create a date range and set index
df['date'] = pd.date_range(start='2018-1-1', end='2018-1-10') # also set as column values
print(f"date column type: {type(df['date'][0])}\ndate index type: {type(df.index)}\n")

df['date'] = df['date'].apply(lambda x: datetime.date(x)) # convert pandas timestamp to datetime.date
print(f"type for datetime.date: {type(df['date'][0])}")

df.set_index('date', inplace=True) # set datetime.date as index
print(f"type for datetime.date as index: {type(df.index)}")

查看第一和第三输出:

date column type: <class 'pandas._libs.tslibs.timestamps.Timestamp'> date index type: <class 'pandas.core.indexes.datetimes.DatetimeIndex'> type for datetime.date: <class 'datetime.date'> type for datetime.date as index: <class 'pandas.core.indexes.base.Index'> <class 'pandas._libs.tslibs.timestamps.Timestamp'>