在熊猫数据框中设置多级索引更改日期时间

问题描述:

我有一个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 |蟒蛇2.3.0
  • 熊猫= = 0.19.2

让我们开始吧与您的第二个问题:

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

解决方法:

是可能的替换索引的一部分。

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

解决方法结果:所以在你的榜样,运用多指标后,datetime可以用date等取代

>>> 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()副作用这最终通过促进datedatetime64

values = _possibly_infer_to_datetimelike(values, convert_dates=True) 

我不知道,如果你看到的效果是由设计或没有,但你可以打开一个问题here

+0

谢谢!这个解决方法为我做了诀窍。但是,在我看来,这仍然是一个意想不到的副作用。我会开一个问题。 – ldocao

+0

这是我发布的问题:https://github.com/pandas-dev/pandas/issues/15636 – ldocao