You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pandas提取CSV中员工每日的首次与末次打卡记录

如何用Pandas提取员工每日的首次与末次打卡记录

没问题,我来帮你搞定这个需求——从CSV文件里提取每位员工每天的首次和末次打卡记录。咱们结合你的数据示例一步步实现:

步骤1:导入Pandas并读取CSV数据

首先咱们先导入Pandas库,然后读取你的CSV文件。因为你的数据没有表头,所以要指定header=None,之后给列起个清晰的名字:

import pandas as pd

# 读取CSV,无表头,自定义列名
df = pd.read_csv('你的打卡文件.csv', header=None, names=['datetime_str', 'employee'])

步骤2:转换日期时间格式

原始的日期时间是字符串格式,咱们得把它转成Pandas的datetime类型,这样才能正确比较时间的早晚:

# 转换字符串为datetime类型
df['datetime'] = pd.to_datetime(df['datetime_str'], format='%m/%d/%Y %H:%M')

步骤3:按员工和日期分组,提取首次/末次打卡

接下来是核心操作:按员工和日期(从datetime里提取日期部分)分组,然后分别取每组的最小(首次打卡)和最大(末次打卡)时间:

# 提取日期部分,作为分组依据之一
df['date'] = df['datetime'].dt.date

# 分组聚合:按员工和日期,取datetime的min和max
result = df.groupby(['employee', 'date'])['datetime'].agg(['min', 'max']).reset_index()

步骤4:整理成你需要的输出格式

现在咱们把聚合后的结果转换成你期望的行格式,每个员工的每日首次、末次打卡各占一行:

# 把min和max拆分成单独的行
first_punch = result[['date', 'min', 'employee']].rename(columns={'min': 'datetime'})
last_punch = result[['date', 'max', 'employee']].rename(columns={'max': 'datetime'})

# 合并两行并排序
final_output = pd.concat([first_punch, last_punch]).sort_values(['employee', 'datetime'])

# 转换成你需要的字符串格式
final_output['datetime_str'] = final_output['datetime'].dt.strftime('%m/%d/%Y %H:%M')
final_output = final_output[['datetime_str', 'employee']]

验证输出

运行完上面的代码后,final_output的结果就和你期望的一致了:

3/4/2020 8:29 Ali
3/4/2020 17:20 Ali
3/4/2020 8:35 Vlad
3/4/2020 17:54 Vlad

如果你的CSV里有更多日期的数据(比如示例里的3/5/2020 Ali的记录),代码也会自动处理,提取该员工当天的首次打卡。

内容的提问来源于stack exchange,提问作者AppleStrudel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:12:28