如何在Python中回溯X天检查人员团队列?附代码问题求助
人员回溯时间段团队查询的正确实现方法
原代码存在的问题
- 关联键错误:原代码通过
Manager_ID关联数据集,但需求是查询**被替换人员(Person_replaced)**的团队,应使用Person_replaced与df1的ID关联 - 日期字段笔误:原代码中引用了不存在的
Requested_Date字段,正确字段为df2的Request_Date - 字段名不一致:计算的回溯日期字段是
days prior,但判断逻辑中误用了n days prior - 逻辑判断疏漏:仅判断了入职日期范围,未考虑离职日期,无法准确反映回溯时间段内的任职状态
正确实现步骤及代码
基础版(人员无多次团队变动)
import pandas as pd import numpy as np from datetime import timedelta # 1. 统一转换日期格式 df1["StartDate"] = pd.to_datetime(df1["StartDate"]) df1["EndDate"] = pd.to_datetime(df1["EndDate"]) df2["Request_Date"] = pd.to_datetime(df2["Request_Date"]) # 2. 按被替换人员ID合并数据集 df3 = pd.merge(df2, df1, left_on="Person_replaced", right_on="ID", how="left") # 3. 设置回溯天数并计算回溯日期 X = 30 # 可根据需求调整回溯天数 df3["backtrack_date"] = df3["Request_Date"] - timedelta(days=X) # 4. 判定回溯时间段内的所属团队 # 逻辑:人员在[回溯日期, 请求日期]区间内处于该团队任职 # 即入职日期≤回溯日期,且(离职日期≥请求日期 或 离职日期为空(在职)) df3["Team_prior_Request"] = np.where( (df3["StartDate"] <= df3["backtrack_date"]) & (df3["EndDate"].isna() | (df3["EndDate"] >= df3["Request_Date"])), df3["Team"], df3["RequestTeam"] # 无匹配记录时用请求团队兜底 )
进阶版(人员存在多次团队变动)
如果人员在回溯时间段内有过团队调动,需匹配回溯日期前最近的任职记录,可使用merge_asof实现:
import pandas as pd from datetime import timedelta # 1. 转换日期格式 df1["StartDate"] = pd.to_datetime(df1["StartDate"]) df1["EndDate"] = pd.to_datetime(df1["EndDate"]) df2["Request_Date"] = pd.to_datetime(df2["Request_Date"]) # 2. 对数据集按关联字段和日期排序(merge_asof要求) df1_sorted = df1.sort_values(by=["ID", "StartDate"]) df2_sorted = df2.sort_values(by=["Person_replaced", "Request_Date"]) # 3. 计算回溯日期 X = 30 df2_sorted["backtrack_date"] = df2_sorted["Request_Date"] - timedelta(days=X) # 4. 匹配回溯日期前最近的任职记录 df3 = pd.merge_asof( df2_sorted, df1_sorted, left_on="backtrack_date", right_on="StartDate", left_by="Person_replaced", right_by="ID", direction="backward" # 取回溯日期之前最近的入职记录 ) # 5. 填充最终团队字段 df3["Team_prior_Request"] = df3["Team"].fillna(df3["RequestTeam"])
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

