使用Pandas拆分考勤时间为InTime和OutTime列
考勤数据处理解决方案(Pandas实现)
1. 数据预处理:解析时间并去重
首先将原始日期字符串转换为可操作的datetime格式,提取日期、时段(AM/PM),同时去除同一用户同一时段的重复打卡记录:
import pandas as pd # 读取原始数据 df = pd.read_csv('input.csv', encoding="utf-8", sep=',') # 解析日期时间(注意格式匹配你的数据,示例格式为"Thu 1/09 9:10 AM") df['datetime'] = pd.to_datetime(df['Date'], format='%a %d/%m %I:%M %p') # 提取纯日期、时段字段 df['date'] = df['datetime'].dt.date df['period'] = df['datetime'].dt.strftime('%p') # 去重:同一用户+同一日期+同一时段,保留最早打卡记录 df = df.sort_values('datetime').drop_duplicates(subset=['User', 'date', 'period'], keep='first')
2. 拆分InTime/OutTime列
通过透视表将AM/PM时段转换为独立列,自动处理缺失时段的空值:
# 生成透视表,按用户+日期分组,AM对应InTime,PM对应OutTime pivot_df = df.pivot_table( index=['User', 'date'], columns='period', values='Date', aggfunc='first' ).reset_index() # 重命名列名符合需求 pivot_df = pivot_df.rename(columns={'AM': 'InTime', 'PM': 'OutTime'})
3. 补全考勤周期内的所有日期
生成考勤周期内的完整日期序列,与用户记录合并,补全无打卡的空记录:
# 获取考勤周期的起止日期 start_date = df['date'].min() end_date = df['date'].max() # 生成周期内所有日期 all_dates = pd.date_range(start=start_date, end=end_date).date # 创建用户+全日期的基础框架(笛卡尔积) user_date_grid = pd.MultiIndex.from_product( [df['User'].unique(), all_dates], names=['User', 'date'] ).to_frame(index=False) # 合并补全空记录 final_df = pd.merge( user_date_grid, pivot_df, on=['User', 'date'], how='left' )
4. 按用户生成独立CSV文件
遍历用户列表,导出每个用户的考勤记录:
# 用户ID与用户名映射 users = { 'falcon': 2, 'charlie': 3, } for username, user_id in users.items(): # 筛选当前用户的记录,仅保留需要的列 user_data = final_df[final_df['User'] == user_id][['InTime', 'OutTime']] # 导出CSV,适配Excel模板 user_data.to_csv(f'{username}.csv', encoding='utf-8', sep=',', index=False)
特殊情况说明
- 重复记录:若需保留最晚打卡记录,将
drop_duplicates中的keep='first'改为keep='last' - 日期格式:若原始日期格式为月/日(如"Thu 9/1 9:10 AM"),需将
pd.to_datetime的format参数改为%a %m/%d %I:%M %p - 空记录:未打卡日期的InTime/OutTime会显示
NaN,Excel打开自动识别为空单元格,适配模板需求
内容的提问来源于stack exchange,提问作者Naveed Abbas
相关产品推荐
相关产品推荐

