python - 如何在一段时间内使用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()
有没有更好的方法来做到这一点?
解决方案
IIUC,您需要从“utctime”中提取小时和分钟,对分钟进行分类并在小时和分钟_bins 上bins
执行消息:groupby
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
推荐阅读
- flutter - 如何有条件地显示一些小部件
- docker - Kubernetes 上的 Jenkins - 从 kubectl 获取容器日志
- javascript - 从第二个数组中过滤匹配值的对象数组
- appium - 如何在 UIAutomator 中获取具有特定模式的所有文本
- javascript - 如何使用节点发布 AutoML(Firebase) 模型?
- php - 什么是课程模块实例/`$cm->instance`?
- plot - 在 Gnuplot 中生成带有误差线的 3D 图
- android - 有没有办法在外部读卡器上自动检测 NFC 卡?
- excel - 循环范围,如果值 = "x" 将值从单元格 8 列复制到其他工作表的右侧
- r - 尝试创建具有 10 倍交叉验证的 CART 模型时出现问题