使用Python Pandas按年统计公司人员事件数量及在职员工数
人员事件统计实现方案(基于Pandas)
前置预处理
先统一转换日期列的格式,避免后续统计出错:
import pandas as pd # 日期格式转换,format参数根据实际日期字符串规则调整 df["hire_date"] = pd.to_datetime(df["hire_date"], format="%d.%m.%Y") df["event_start_date"] = pd.to_datetime(df["event_start_date"], format="%d.%m.%Y")
1. 统计每年入职数量
按要求入职时间统一以hire_date为准,每个员工仅对应一条入职记录,因此先对员工ID去重再按年份统计:
# 去重后统计各年份入职人数 hire_stats = df.drop_duplicates("employee_id")["hire_date"].dt.year.value_counts().sort_index() # 格式化输出 hire_stats = hire_stats.reset_index() hire_stats.columns = ["年份", "入职人数"]
2. 统计每年离职数量
筛选事件类型为termination的记录,按事件发生年份统计即可:
# 筛选离职事件按年统计 termination_stats = df[df["event"] == "termination"]["event_start_date"].dt.year.value_counts().sort_index() # 格式化输出 termination_stats = termination_stats.reset_index() termination_stats.columns = ["年份", "离职人数"]
3. 统计每年在职员工数量
默认统计逻辑为:统计年份晚等于入职年份,且早于离职年份(无离职记录则默认至今在职),不含临时请假的扣除,如果需要统计扣除请假的在职人数可额外关联leave事件的时间范围计算。
# 先聚合每个员工的入职、离职年份 employee_info = df.groupby("employee_id").agg( hire_year = ("hire_date", lambda x: x.dt.year.iloc[0]), # 没有离职记录的员工默认离职年份为9999,代表至今在职 termination_year = ("event_start_date", lambda x: x[df.loc[x.index, "event"]=="termination"].dt.year.iloc[0] if (df.loc[x.index, "event"]=="termination").any() else 9999) ).reset_index() # 确定统计的年份范围,可根据需求自行调整 min_year = employee_info["hire_year"].min() max_year = pd.Timestamp.now().year all_years = range(min_year, max_year+1) # 遍历统计每年在职人数 active_stats = [] for year in all_years: active_num = len(employee_info[ (employee_info["hire_year"] <= year) & (employee_info["termination_year"] > year) ]) active_stats.append({"年份": year, "在职人数": active_num}) active_stats = pd.DataFrame(active_stats)
示例数据输出结果
对应你给出的测试数据,统计结果如下:
- 入职统计:2005年1人、2007年1人、2019年1人
- 离职统计:2020年2人
- 在职统计:2005年1人、2006年1人、2007-2018年每年2人、2019年3人、2020年及之后每年1人
内容的提问来源于stack exchange,提问作者OlaG
相关产品推荐
相关产品推荐

