按日期对 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 进行排序