python - 计算 pandas 中每个日期员工的总工作时间

标签 python pandas

我有这样的 pandas 数据框:

Employee_id  timestamp
   1        2017-06-21 04:47:45
   1        2017-06-21 04:48:45
   1        2017-06-21 04:49:45

对于每位员工,如果他/她在办公室,我每 1 分钟就会收到 ping 信息。 我有大约 2000 个员工的 ping,我需要如下输出:

Employee_id    date           Total_work_hour
     1      2018-06-21               8
     1      2018-06-22               7
     2      2018-06-21               6
     2      2018-06-22               8

所有 2000 名员工

最佳答案

使用groupby带有 diff 的 lambda 函数计算所有差异的总和,然后通过 total_seconds 将其转换为秒然后除以 3600 得到小时:

df1 = (df.groupby(['Employee_id', df['timestamp'].dt.date])['timestamp']
        .apply(lambda x: x.diff().sum())
        .dt.total_seconds()
        .div(3600)
        .reset_index(name='Total_work_hour'))
print (df1)
   Employee_id  timestamp  Total_work_hour
0            1 2017-06-21         0.033333

但是如果可能缺少一些连续分钟,可以使用自定义函数:

print (df)
   Employee_id           timestamp
0            1 2017-06-21 04:47:45
1            1 2017-06-21 04:48:45
2            1 2017-06-21 04:49:45
3            1 2017-06-21 04:55:45

def f(x):
    vals = x.diff()
    return vals.mask(vals > pd.Timedelta(60, unit='s')).sum()

df1 = (df.groupby(['Employee_id', df['timestamp'].dt.date])['timestamp']
        .apply(f)
        .dt.total_seconds()
        .div(3600)
        .reset_index(name='Total_work_hour')
        )
print (df1)
   Employee_id  timestamp  Total_work_hour
0            1 2017-06-21         0.033333

关于python - 计算 pandas 中每个日期员工的总工作时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52927938/

相关文章:

python - 在执行一些额外操作的同时将数据帧重新采样为新数据帧

python - 在 Pandas 中将字符串转换为时间

python - python 中的有条件颜色文本

python - 捕获导致 SQLite 多线程访问错误的对象

python - 如何创建requirements.txt?

python - 使用 Selenium/WebDriver 和 Python,如何抑制共享摄像头和麦克风的提示?

python - 如何根据计算条件新建一列?

python - 使用 Pandas Dataframe 中的数学库检查 NaN

Python:你能在对象引用中使用计算表达式吗?

python - Pandas DataFrame 在其他 DataFrame 上进行条件过滤,该功能在版本 0.20.x 上不再起作用