2017-03-07 61 views
2

我有一個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

回答

0

讓我們開始吧與您的第二個問題:

如何定義保持日期類型的多級索引?

解決方法:

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

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

相關問題