我有一个包含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
答案 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 =参数。