如何在一段时间内使用pandas groupby并在同一时间段内查找多年来的平均计数

时间:2018-12-08 12:14:58

标签: python pandas

我进行了广泛搜索,但是还没有找到一种很好的方法。我有一个带有自己的短信数据的熊猫数据框。它具有“ utctime”,“发件人”,“收件人”和“消息”列。我想做的是将其按任意分钟的时间段(例如10或20分钟)进行分组,然后在多年中查看我每天在该时间段内发送的邮件数量。

数据的前几行看起来像这样,并且延续了2年之久:

                        utctime  sender   recipient     message
0 2016-11-25 18:00:25.877000+00:00  Person1  Me            message1
1 2016-11-25 18:50:58.694000+00:00  Person2  Me            message2
2 2016-11-25 18:54:41.871000+00:00  Me       Person2       message3
3 2016-11-25 18:54:58.583000+00:00  Person2  Me            message4
4 2016-11-25 19:01:19.694000+00:00  Me       Person2       message5

什么是最好的方法,这样我可以从00:00到23:40以20分钟的增量看到自己的短信发送频率?

到目前为止,我要做的是拥有另一个功能,可以将时间缩减为一天:

def time_of_day(data, tz_info):
    utctime = data.utctime.dt.tz_convert(tz_info)
    data['timeofday'] = pd.to_datetime({'year': 2017,
                                        'month': 1,
                                        'day': 1,
                                        'hour': utctime.dt.hour,
                                        'minute': utctime.dt.minute,
                                        'second': utctime.dt.second})

    return data

然后我使用自定义石斑鱼分组:

sf = pytz.timezone('US/Pacific')
timedelta = '10min'
grouper = pd.Grouper(key='timeofday', freq=timedelta)
data = time_of_day(data, sf) # data is returned in time of day for tz

freq = data.groupby(grouper).count()

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

IIUC,您需要从“ utctime”中提取小时和分钟,对bins中的分钟进行分类,并对消息groupby的小时和分钟bins执行count

df['Hour'] = pd.to_datetime(df['utctime']).dt.hour
df['Minute'] = pd.to_datetime(df['utctime']).dt.minute

df['minute_bins'] = pd.cut(df['Minute'], bins=(-0.01,20,40,60), labels=('0 < 20', '20 < 40', '40 < 60'))

df.groupby(['Hour', 'minute_bins'])['message'].count()

print(df)

Hour  minute_bins
18    0 < 20         1
      40 < 60        3
19    0 < 20         1