按日期对Pandas DataFrame进行分组

Dav*_*ard 6 datetime group-by python-2.7 pandas

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

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

这个问题非常相似,但我不理解代码,它使用datetime对象.

文档中,我甚至不了解如何从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
Run Code Online (Sandbox Code Playgroud)

And*_*den 14

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

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
Run Code Online (Sandbox Code Playgroud)

你可以这样组合:

g = df.groupby(pd.DatetimeIndex(df['date']).normalize())
Run Code Online (Sandbox Code Playgroud)

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

g = df.groupby(df['date'].dt.normalize())
Run Code Online (Sandbox Code Playgroud)

  • 另一种选择:`pd.DatetimeIndex(df ["date"]).date`代替.一个优点是,你想要分组的许多常见内容都是内置的:`.month`,`.year`,`..hour`等. (2认同)

小智 6

不清楚您是尝试分组和聚合(如在 SQL 中)还是创建带有日期而不是时间戳的索引。

如果你想分组和聚合,你可以这样做:

df.groupby(df.set_index('date').index.date).mean()
Run Code Online (Sandbox Code Playgroud)

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

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

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

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