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['行动'].
任何想法将不胜感激!
你的问题不清楚。如果您想要以下输出,请使用以下代码。 如果所需的输出与以下不同,请以文本表的形式清楚地提供所需的输出。
此外,您的示例有拼写错误,无法运行它。
代码
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