按日期对Pandas DataFrame进行分组

时间:2013-11-21 16:34:03

标签: datetime python-2.7 group-by pandas

我有一个包含date列的Pandas DataFrame。该列的元素属于pandas.tslib.Timestamp类型。

我想按日期对数据框进行分组,但要排除日期更精细的时间戳信息(即按日期分组,其中所有Feb 23, 2011都已分组)。我知道如何在SQL中表达这一点,但对Pandas来说却是新手。

This question做了类似的事情,但我不理解代码并使用datetime个对象。

documentation,我甚至不知道如何从Pandas Timestamp对象中检索日期。我可以转换为datetime对象,但这似乎非常迂回。


根据要求,df.head()的输出:

    date    show    network timed   session_id
0   2011-12-03 02:48:52  Monk    TV38    670     00003DA9-01D2-E7A9-4177-203BE6A9E2BA    
1   2011-12-03 03:00:09  WBZ News    TV38    205     00003DA9-01D2-E7A9-4177-203BE6A9E2BA
2   2011-12-03 03:04:04  Dateline NBC    NBC     30  00003DA9-01D2-E7A9-4177-203BE6A9E2BA
3   2011-12-03 03:04:35  20/20   ABC     25  00003DA9-01D2-E7A9-4177-203BE6A9E2BA
4   2011-12-03 03:04:56  College Football    FOX     55  00003DA9-01D2-E7A9-4177-203BE6A9E2BA

2 个答案:

答案 0 :(得分:14)

您可以使用normalize DatetimeIndex方法(将其带到当天的午夜):

In [11]: df['date']
Out[11]: 
0   2011-12-03 02:48:52
1   2011-12-03 03:00:09
2   2011-12-03 03:04:04
3   2011-12-03 03:04:35
4   2011-12-03 03:04:56
Name: date, dtype: datetime64[ns]

In [12]: pd.DatetimeIndex(df['date']).normalize()
Out[12]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2011-12-03 00:00:00, ..., 2011-12-03 00:00:00]
Length: 5, Freq: None, Timezone: None

你可以这样组合:

g = df.groupby(pd.DatetimeIndex(df['date']).normalize())

在0.15中你可以访问dt属性,所以可以写成:

g = df.groupby(df['date'].dt.normalize())

答案 1 :(得分:4)

目前尚不清楚您是在尝试分组和聚合(如在SQL中)还是使用日期而不是时间戳创建索引。

如果你正在尝试分组和聚合,你可以这样做:

df.groupby(df.set_index('date').index.date).mean()

时间序列索引具有日期时间,如日期,日期等。这将聚合定时列,因为它是唯一的数字列。

如果您尝试创建具有日期级别的索引,则可以执行以下操作:

import datetime
df.set_index(['date', df.date.apply(lambda x: datetime.datetime.date(x))], inplace=True)
df.index.names = ['timestamp', 'daydate']

这将为您提供带有时间戳和日期的多索引。如果您不希望索引是永久性的,请删除inplace =参数。