设置多级索引将日期更改为pandas dataframe中的datetime

时间:2017-03-07 12:48:16

标签: python pandas datetime

我的pandasDataFrame包含datetime.date列。当我设置多级索引时,日期列将转换为datetime.datetime对象,这在设置单级索引时不会发生。这是正常的行为吗?如何定义保持date类型的多级索引?

import datetime
import pandas as pd
values = [("a", datetime.date(2015,1,1), 30.),                                                                                                                                   
          ("a", datetime.date(2015,1,2), 25.)]                                                                                                                                   
columns = ["id", "date", "amount"]                                                                                                              
df = pd.DataFrame(values, columns=columns)                                                                                                                                                         
df_single = df.set_index("date")
df_multi = df.set_index(["id", "date"])   

这是输出:

print(df_multi.index)
# MultiIndex(levels=[['a'], [2015-01-01 00:00:00, 2015-01-02 00:00:00]],
#            labels=[[0, 0], [0, 1]],
#            names=['id', 'date'])

print(df_single.index)
# Index([2015-01-01, 2015-01-02], dtype='object', name='date')    

有关信息,我使用以下版本:

  • Python 3.4.5 | Anaconda 2.3.0
  • 大熊猫== 0.19.2

1 个答案:

答案 0 :(得分:0)

让我们从你的第二个问题开始:

  

如何定义保持日期类型的多级索引?

解决方法:

可以替换部分索引。因此,在您的示例中,应用多索引后,datetime可以替换为date,如:

df_multi.index.set_levels([df['date'].values], level=[1], inplace=True)

解决方法结果:

>>> print(df_multi.index)
MultiIndex(levels=[[u'a'], [2015-01-01, 2015-01-02]],
           labels=[[0, 0], [0, 1]],
           names=[u'id', u'date'])

<强>为什么吗

关于你的第一个问题:

  

这是正常行为吗?

这是正常的,因为代码肯定会这样做。此行为是pandas.core.categorical.Categorical()的副作用,最终通过以下方式将date推广到datetime64

values = _possibly_infer_to_datetimelike(values, convert_dates=True)

我不知道您所看到的效果是否符合设计,但您可以打开问题here