各行之间的熊猫差异之和

时间:2019-01-21 02:57:11

标签: python pandas

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      |
-------------------

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

希望这有助于您进行基本了解。通过向我们提供测试数据来尝试阐明您的问题。