考勤数据分析需求:打卡去重、时段统计及空值处理方案咨询
考勤大数据清洗与统计解决方案
针对10万+条考勤数据的清洗与统计需求,推荐以下两种高效解决方案:
方案一:Python Pandas 处理(高效适配大数据量)
Pandas 对结构化数据的处理效率远高于Excel函数,适合十万级以上数据量操作:
步骤1:数据读取与预处理
假设考勤数据包含员工ID、打卡日期、打卡时间、打卡类型(Clock-in/Clock-out)字段:
import pandas as pd # 读取数据(支持Excel、CSV等格式) df = pd.read_excel("考勤数据.xlsx") # 删除空时间戳记录 df = df.dropna(subset=["打卡时间"]) # 合并日期与时间为完整datetime格式(方便后续分组) df["完整打卡时间"] = pd.to_datetime(df["打卡日期"].astype(str) + " " + df["打卡时间"].astype(str))
步骤2:提取每日首次Clock-in与末次Clock-out
# 按员工ID、打卡日期、打卡类型分组,提取首/末记录 # 首次Clock-in:每组最早的时间 first_clockin = df[df["打卡类型"] == "Clock-in"].groupby(["员工ID", "打卡日期"])["完整打卡时间"].min().reset_index(name="首次打卡时间") # 末次Clock-out:每组最晚的时间 last_clockout = df[df["打卡类型"] == "Clock-out"].groupby(["员工ID", "打卡日期"])["完整打卡时间"].max().reset_index(name="末次打卡时间") # 合并首末打卡数据 cleaned_df = pd.merge(first_clockin, last_clockout, on=["员工ID", "打卡日期"], how="outer")
步骤3:统计不同时间区间的打卡人数
以上班打卡(首次Clock-in)为例,定义时间区间并统计:
# 提取打卡小时分钟部分,划分区间 cleaned_df["打卡时段"] = pd.cut(cleaned_df["首次打卡时间"].dt.time, bins=[pd.to_datetime("00:00").time(), pd.to_datetime("08:00").time(), pd.to_datetime("08:30").time(), pd.to_datetime("23:59").time()], labels=["8:00前", "8:00-8:30", "8:30后"]) # 统计各区间员工数量(按整体统计,如需按日期统计可添加日期分组) result = cleaned_df.groupby("打卡时段")["员工ID"].nunique().reset_index(name="员工数量") print(result)
若需统计下班打卡(末次Clock-out)的区间,替换首次打卡时间为末次打卡时间即可。
方案二:Excel Power Query 处理(适合Excel用户)
Power Query 是Excel内置的高效数据处理工具,无需复杂代码,处理10万条数据远快于COUNTIFS:
- 导入数据到Power Query:选中数据区域 → 「数据」选项卡 → 「从表格/范围」,进入Power Query编辑器。
- 删除空时间戳:选中「打卡时间」列 → 「开始」选项卡 → 「删除行」→ 「删除空值行」。
- 提取每日首末打卡:
- 点击「转换」选项卡 → 「分组依据」,设置分组列为
员工ID、打卡日期、打卡类型,操作选择「最小值」(对应Clock-in的首次)或「最大值」(对应Clock-out的末次),针对不同打卡类型分别分组后合并结果。
- 点击「转换」选项卡 → 「分组依据」,设置分组列为
- 添加时间区间并统计:
- 转换打卡时间为可计算格式,添加自定义列判断所属区间(示例公式:
= if [首次打卡时间] < #time(8,0,0) then "8:00前" else if [首次打卡时间] < #time(8,30,0) then "8:00-8:30" else "8:30后")。 - 回到Excel,用数据透视表按时间区间统计不同日期或整体的员工数量。
- 转换打卡时间为可计算格式,添加自定义列判断所属区间(示例公式:
内容的提问来源于stack exchange,提问作者Likhona Matinjwa
相关产品推荐
相关产品推荐

