Pandas数据帧groupby在日期字段中

时间:2017-09-23 19:16:03

标签: python pandas

>>> 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

1 个答案:

答案 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())