基于Pandas计算许可证签出的Elapsed Time(耗时)
许可证使用耗时统计解决方案
问题背景
有一份50万+行的许可证签出记录,需用Pandas新增Elapsed_Time列(单位:小时)统计使用耗时,数据存在非理想顺序的记录(如OUT、OUT、IN、IN),此前尝试groupby结合自定义函数时无法正确引用列。
示例数据
import pandas as pd data = [ {'DateTime': pd.to_datetime('2023-09-26 09:36:47'), 'Action': 'OUT', 'LicenseCode': 'APP01', 'User': 'USER01'}, {'DateTime': pd.to_datetime('2023-09-26 11:01:55'), 'Action': 'IN', 'LicenseCode': 'APP01', 'User': 'USER01'}, {'DateTime': pd.to_datetime('2023-09-27 10:01:20'), 'Action': 'OUT', 'LicenseCode': 'APP02', 'User': 'USER02'}, {'DateTime': pd.to_datetime('2023-09-27 14:46:09'), 'Action': 'IN', 'LicenseCode': 'APP02', 'User': 'USER02'}, {'DateTime': pd.to_datetime('2023-09-27 13:27:57'), 'Action': 'OUT', 'LicenseCode': 'APP02', 'User': 'USER01'}, {'DateTime': pd.to_datetime('2023-09-27 18:03:09'), 'Action': 'IN', 'LicenseCode': 'APP02', 'User': 'USER01'} ] df = pd.DataFrame(data)
统计规则
- 按**日期(Day)、用户(User)、许可证代码(LicenseCode)**分组,仅统计每组内当日的耗时
Action为OUT时,Elapsed_Time初始为0;连续两条OUT时,当前行取与上一条记录的时间差(累计值)Action为IN时,Elapsed_Time为自上一条OUT记录以来的累计时间差- 兼容非理想顺序的记录(如
OUT、OUT、IN、IN)
解决方案
核心思路是分组后标记OUT的批次,计算每个批次内的时间差累计,避免循环操作保证大数据量处理效率:
# 提取日期作为分组键之一 df['Date'] = df['DateTime'].dt.date # 按日期、用户、许可证分组,禁用组键以简化后续处理 grouped = df.groupby(['Date', 'User', 'LicenseCode'], group_keys=False) def calculate_elapsed(group): # 组内按时间排序,确保时间顺序正确 group = group.sort_values('DateTime').reset_index(drop=True) # 标记OUT批次:每遇到OUT就开启一个新批次 group['out_batch'] = group['Action'].eq('OUT').cumsum() # 计算批次内每条记录与上一条的时间差(转小时) group['time_diff'] = group.groupby('out_batch')['DateTime'].diff().dt.total_seconds() / 3600 # 填充批次第一条记录的空值为0,再计算累计和得到Elapsed_Time group['Elapsed_Time'] = group['time_diff'].fillna(0).cumsum() # 删除临时辅助列 return group.drop(['Date', 'out_batch', 'time_diff'], axis=1) # 应用函数到所有分组,得到最终结果 result_df = grouped.apply(calculate_elapsed)
验证效果
以用户提供的期望示例测试,运行代码后可得到符合规则的输出,例如:
| DateTime | Action | LicenseCode | User | Elapsed_Time |
|---|---|---|---|---|
| 2023-09-27 17:00:00 | OUT | APP01 | USER02 | 0.50 |
| 2023-09-27 17:12:00 | OUT | APP01 | USER02 | 0.70 |
| 2023-09-27 17:42:00 | IN | APP01 | USER02 | 1.20 |
| 2023-09-27 17:52:00 | IN | APP01 | USER02 | 1.37 |
该方案基于Pandas内置分组函数实现,性能高效,可直接处理50万+行的数据集。
内容的提问来源于stack exchange,提问作者Unsullied
相关产品推荐
相关产品推荐

