Pandas 计算经过的时间

问题描述 投票:0回答:1
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)
df.groupby([pd.Grouper(key='DateTime', freq='D'),'User', 'LicenseCode'])

大家好,我想为许可证签出示例数据中的许可证创建一个新的经过时间列(以小时为单位)。这只是 500k 多行的一个片段。

新专栏的条件:

  • 必须按照上面提供的条件进行分组。

  • 如果“操作”== OUT,则经过的时间 = 0

  • 如果“Action”== IN,则经过的时间=计算前一个“OUT”行的累积时间差异(它们成对工作,先是 OUT,然后是 IN)

  • 存在 OUT、OUT、IN、IN 的实例(“操作”行的顺序),最理想的是 OUT、IN、OUT、IN

当我尝试使用自定义函数进行分组聚合时,我遇到了困难,因为我无法通过例如以下方式引用列: df['行动'].

任何想法将不胜感激!

pandas group-by split-apply-combine
1个回答
0
投票

你的问题不清楚。如果您想要以下输出,请使用以下代码。 如果所需的输出与以下不同,请以文本表的形式清楚地提供所需的输出。

此外,您的示例有拼写错误,无法运行它。

代码

cond = df['Action'].eq('OUT')
grp = cond.groupby(df['LicenseCode']).cumsum()
df['elapsed time'] = df.groupby([grp, 'LicenseCode'])['DateTime'].diff().mask(cond, 0)

df:

             DateTime Action LicenseCode    User     elapsed time
0 2023-09-26 09:36:47    OUT       APP01  USER01                0
1 2023-09-26 11:01:55     IN       APP01  USER01  0 days 01:25:08
2 2023-09-27 10:01:20    OUT       APP02  USER02                0
3 2023-09-27 14:46:09     IN       APP02  USER02  0 days 04:44:49
4 2023-09-27 13:27:57    OUT       APP02  USER01                0
5 2023-09-27 18:03:09     IN       APP02  USER01  0 days 04:35:12
© www.soinside.com 2019 - 2024. All rights reserved.