>>> 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'])
为什么在分组时将日期字段转换为第二种情况的日期时间(仅限)?
我正在使用pandas 0.19.2
答案 0 :(得分: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()
但是一个非常有趣的观察。在处理datetime.date对象时,索引和Multiindex以及Series.max()和Series.apply()似乎没有一致地实现。
解决方案:如果您从头开始将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())