Pandas的新手,我用它来解析一个excel文件,其中包含从安全记录接收的IN / OUT计时的员工数据。 我希望从“日志时间”列获取“类型”列的连续OUT-IN的diff值,并获取OUT-IN-1的总数。 感谢您的帮助,数学使我的头脑变得果冻。
样本数据:
_________________________
| Emp | Log Time | Type |
-------------------------
| 001 | 9:30:00 | IN |
-------------------------
| 001 | 9:35:00 | OUT |
-------------------------
| 001 | 10:30:00 | IN |
-------------------------
| 001 | 18:30:00 | OUT |
预期的输出格式:
001
-------------------
| IN | 9:30:00 |
-------------------
| OUT | 18:30:00 |
-------------------
| TOTAL| 9:00:00 |
-------------------
| Work | 8:00:00 |
-------------------
| I/O | 1 |
-------------------
答案 0 :(得分:1)
假设您有一个df
(输入数据框),其格式如下:
>>print(df)
EMP LOG TIME TYPE
0 1 09:30:15 IN
1 1 10:30:15 OUT
2 1 11:30:15 IN
3 1 17:30:15 OUT
4 2 09:30:15 IN
5 2 10:15:15 OUT
6 2 11:05:28 IN
7 2 18:30:15 OUT
您可以基于groupby
值使用EMP
并为min
找到IN
,为max
找到OUT
。代码如下:
from datetime import datetime
df1 = df[df['TYPE'] == 'IN'].groupby(['EMP']).min().reset_index()
df1 = df1.rename(index=str, columns={"LOG TIME": "LOG TIME IN", "TYPE": "TYPE IN"})
df2 = df[df['TYPE'] == 'OUT'].groupby(['EMP']).max().reset_index()
df2 = df2.rename(index=str, columns={"LOG TIME": "LOG TIME OUT", "TYPE": "TYPE OUT"})
df2 = df2.drop(['EMP'],axis=1)
您现在可以使用concat
并按行合并两个数据帧,并减去两列并将结果作为新列放入。
df3 = pd.concat([df1,df2],axis=1)
total_hrs = []
for index,row in df3.iterrows():
total_hrs.append(datetime.strptime(str(row['LOG TIME OUT']),'%H:%M:%S') -
datetime.strptime(str(row['LOG TIME IN']),'%H:%M:%S'))
df3['TOTAL HOURS'] = total_hrs
希望这有助于您进行基本了解。通过向我们提供测试数据来尝试阐明您的问题。