首页 > 解决方案 > 如何在一段时间内使用pandas groupby并找到同一时间段内多年的平均计数

问题描述

我进行了广泛的搜索,但还没有找到这样做的好方法。我有一个带有我自己的短信数据的熊猫数据框。它有“utctime”、“sender”、“recipient”和“message”列。我想做的是按任意分钟时间段(例如 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()

有没有更好的方法来做到这一点?

标签: pythonpandas

解决方案


IIUC,您需要从“utctime”中提取小时和分钟,对分钟进行分类并在小时和分钟_bins 上bins执行消息:groupbycount

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

推荐阅读