2017-09-23 85 views
0
>>> df = pd.DataFrame(zip(np.random.rand(5).tolist(), [1]*5, [dt.date.today()]*5), columns=list('abc')) 
>>> df 
    a b c 
0 0.896739 1 2017-09-24 
1 0.473168 1 2017-09-24 
2 0.100591 1 2017-09-24 
3 0.870899 1 2017-09-24 
4 0.716934 1 2017-09-24 

>>> print df.groupby('c').a.apply(lambda x: x.max()).index 
Index([2017-09-24], dtype='object', name=u'c') 

>>> df.groupby(['b', 'c']).a.apply(lambda x: x.max()).index 
MultiIndex(levels=[[1], [2017-09-24 00:00:00]], labels=[[0], [0]], 
     names=[u'b', u'c']) 

>>> print df.groupby(['b', 'c']).a.max().index 
MultiIndex(levels=[[1], [2017-09-24]], labels=[[0], [0]], 
     names=[u'b', u'c']) 

爲什麼日期字段在第二種情況下轉換爲日期時間(僅)分組時?我使用熊貓0.19.2熊貓數據框groupby在日期字段

+0

同樣的問題'0.20.3' - 它看起來像錯誤。 'print(df.groupby(['b','c'])。a.apply(lambda x:x.max())。index.get_level_values(1))' – jezrael

回答

0

實際上

,僅在第二情況下,日期字段被轉換爲時間戳。在情況1和3中,日期字段是日期時間:

print df.groupby('c').a.apply(lambda x: x.max()).index.tolist() 
print df.groupby(['b', 'c']).a.apply(lambda x: x.max()).index.tolist() 

但是一個非常有趣的觀察。索引和Multiindex以及Series.max()和Series.apply()在處理datetime.date對象時似乎並不一致。

解決方案:如果你從一開始就轉換dt.date.today()到pandas.Timestamp或numpy.datetime64,日期字段都是一致的時間戳:

df = pd.DataFrame(list(zip(np.random.rand(5).tolist(), [1]*5, [np.datetime64(dt.date.today())]*5)), columns=list('abc')) 
print(df.groupby('c').a.apply(lambda x: x.max()).index.tolist()) 
print(df.groupby('c').a.max().index.tolist()) 
print(df.groupby(['b', 'c']).a.apply(lambda x: x.max()).index.tolist()) 
print(df.groupby(['b', 'c']).a.max().index.tolist())