You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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)

验证效果

以用户提供的期望示例测试,运行代码后可得到符合规则的输出,例如:

DateTimeActionLicenseCodeUserElapsed_Time
2023-09-27 17:00:00OUTAPP01USER020.50
2023-09-27 17:12:00OUTAPP01USER020.70
2023-09-27 17:42:00INAPP01USER021.20
2023-09-27 17:52:00INAPP01USER021.37

该方案基于Pandas内置分组函数实现,性能高效,可直接处理50万+行的数据集。

内容的提问来源于stack exchange,提问作者Unsullied

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:15:10