如何使用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
相关产品推荐
相关产品推荐

