python - Pandas:按日期分组,在其他列上聚合
问题描述
我有这个数据框。这是有关许可证使用的信息:
usuario feature fini ffin delta
0 USER-1 PROGRAM-1 2016-06-30 21:03:21 2016-06-30 21:03:34 00:00:13
2 USER-1 PROGRAM-1 2016-06-30 21:09:20 2016-06-30 21:09:32 00:00:12
4 USER-1 PROGRAM-1 2016-06-30 21:14:40 2016-06-30 21:15:34 00:00:54
6 USER-1 PROGRAM-1 2016-06-30 21:16:42 2016-06-30 21:17:24 00:00:42
8 USER-1 PROGRAM-1 2016-06-30 21:18:09 2016-06-30 21:18:21 00:00:12
对不起,西班牙语的字段,但你明白了。fini
表示 fecha inicial (初始日期)和ffin
fecha final (结束日期),因为您猜测 delta 是ffin-fini
所以,我想知道在这种情况下,USER-1 在他正在工作的任何程序(PROGRAM-1)中花费了多少时间。
如果我做了table['delta'].sum()
我得到了我想要的,它说他在 00:02:13 使用它。
现在假设我有更多用户、更多功能,并且我想按天(可能是几个小时)对它们进行分组,以查看人们如何使用他们的许可证
我尝试了重新采样,但我真的不明白它是如何工作的。我看到有一个 Grouper 功能,但我没有安装它。
解决方案
下面的行将帮助您按用户、日期和小时进行分组(仅供参考。如果您改为使用df['fini'].dt.hour
它将汇总多天同一小时的值):
df.groupby([df['usuario'], df['fini'].apply(lambda x: x.round('h'))]).delta.sum()
将此应用于示例的扩展版本:
d = {
'usuario':['USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-2','USER-2'],
'feature':['PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-2','PROGRAM-2','PROGRAM-1','PROGRAM-1'],
'fini':['2016-06-30 21:03:21','2016-06-30 21:09:20','2016-06-30 21:14:40','2016-06-30 21:16:42','2016-06-30 21:18:09', '2016-06-30 22:03:21','2016-06-30 22:09:20','2016-07-01 21:03:21','2016-07-01 22:09:20','2016-07-01 23:14:40','2016-06-30 17:16:42','2016-06-30 18:18:09'],
'ffin':['2016-06-30 21:03:34','2016-06-30 21:09:32','2016-06-30 21:15:34','2016-06-30 21:17:24','2016-06-30 21:18:21', '2016-06-30 22:04:02','2016-06-30 22:09:51','2016-07-01 21:03:43','2016-07-01 22:10:12','2016-07-01 23:15:03','2016-06-30 17:17:23','2016-06-30 18:18:19']
}
df = pd.DataFrame(data=d)
date_cols = ['fini', 'ffin']
for col in date_cols:
df[col] = pd.to_datetime(df[col])
df['delta'] = df['ffin'] - df['fini']
df.groupby([df['usuario'], df['fini'].apply(lambda x: x.round('h'))]).delta.sum()
输出以下内容:
usuario fini
USER-1 2016-06-30 21:00:00 00:02:13
2016-06-30 22:00:00 00:01:12
2016-07-01 21:00:00 00:00:22
2016-07-01 22:00:00 00:00:52
2016-07-01 23:00:00 00:00:23
USER-2 2016-06-30 17:00:00 00:00:41
2016-06-30 18:00:00 00:00:10
Name: delta, dtype: timedelta64[ns]
此外,如果您愿意,向 groupby 添加功能很简单:
df.groupby([df['usuario'], df['feature'], df['fini'].apply(lambda x: x.round('h'))]).delta.sum()
输出:
usuario feature fini
USER-1 PROGRAM-1 2016-06-30 21:00:00 00:02:13
2016-06-30 22:00:00 00:01:12
2016-07-01 21:00:00 00:00:22
PROGRAM-2 2016-07-01 22:00:00 00:00:52
2016-07-01 23:00:00 00:00:23
USER-2 PROGRAM-1 2016-06-30 17:00:00 00:00:41
2016-06-30 18:00:00 00:00:10
Name: delta, dtype: timedelta64[ns]
推荐阅读
- android - 调试 .NET MAUI android 应用程序时断点未命中
- haproxy - 使用数据平面 api 在 haproxy 中更新 env 变量(setenv)
- c# - 在运行时按需下载/安装稀有功能的库
- c# - IIS 上的 TelegramBotClient HttpRequestException
- python-3.x - pyinstaller exe 等待用户在命令提示符下输入任何键,然后继续下一次迭代。如何在不输入任何密钥的情况下保持运行
- redirect - Access-Control-Allow-Origin 等于 origin 但浏览器仍然拒绝访问...为什么?
- azure - Azure Logic 使用 Outlook 连接器作为组发送电子邮件
- python - 如何在熊猫中设置具有多个日期的多索引?
- c# - 尝试在 C# selenium 中使用 Webdriver Manager 下载 msedge 驱动程序时出现错误
- javascript - 访问里面的链接
- 使用 javascript 标记