按日期对 Pandas DataFrame 进行分组

Posted

技术标签:

【中文标题】按日期对 Pandas DataFrame 进行分组【英文标题】:Grouping Pandas DataFrame by date 【发布时间】:2013-12-06 06:13:35 【问题描述】:

我有一个包含 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

【问题讨论】:

df.head() 的输出将在这里受到欢迎 【参考方案1】:

您可以使用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())

【讨论】:

谢谢,我明白了,这正是我想要的。 另一种选择:pd.DatetimeIndex(df["date"]).date。一个优点是内置了许多您想要分组的常见事物:.month.year.hour 等。 这种方法似乎忽略了时区,但 patrickrm101 没有。 @DavidChouinard 真的吗?这听起来像一个错误,它会在github上发布一个问题github.com/pydata/pandas/issues/new【参考方案2】:

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

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

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

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

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

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

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

【讨论】:

我的意思是 groupby 和 aggregate。看起来你的方法比安迪海登的方法更通用一些(即工作不止几天)。

以上是关于按日期对 Pandas DataFrame 进行分组的主要内容,如果未能解决你的问题,请参考以下文章

按 10 分钟间隔对 pandas DataFrame 进行分组[重复]

按一级 MultiIndex 对 pandas DataFrame 进行排序

pandas使用sort_values函数对dataframe的日期数据列进行排序(设置ascending参数进行正序或者倒序排序)

如何在 Python 中按多列对 Pandas DataFrame 进行排序

groupby pandas dataframe 同时按日期和 id

pandas DataFrame中按日期(在索引中)的加权平均分组(每列不同的操作)