Python中如何匹配两个数据集的日期并关联人员团队信息
数据集匹配与名称标准化解决方案
核心问题拆解
要完成需求需解决两个关键问题:
- 名称格式不一致:比如
BLAKE D.与Blake无法直接匹配,需先做标准化处理 - 日期范围筛选:将
df2中Start_Date落在df1对应人员PRIOR_DATE和CREATED_DATE区间内的记录筛选出来
分步实现方案(Python Pandas)
1. 名称标准化处理
统一两个数据集的名称格式,消除大小写、后缀/中间名差异:
import pandas as pd import re # 定义名称标准化函数 def standardize_name(name): # 转小写+去除首尾空格 cleaned = name.strip().lower() # 移除中间名/后缀(如 "Blake D." → "blake") cleaned = re.sub(r'\s*\..*', '', cleaned) return cleaned # 为两个数据集添加标准化名称列 df1['NAME_STD'] = df1['NAME'].apply(standardize_name) df2['NAME_STD'] = df2['Name'].apply(standardize_name)
2. 日期类型转换
将字符串格式的日期转为datetime类型,才能进行范围比较:
# 转换df1的日期列 df1[['CREATED_DATE', 'PRIOR_DATE']] = df1[['CREATED_DATE', 'PRIOR_DATE']].apply( pd.to_datetime, format='%m/%d/%Y' ) # 转换df2的日期列 df2[['Start_Date', 'End_Date']] = df2[['Start_Date', 'End_Date']].apply( pd.to_datetime, format='%m/%d/%Y' )
3. 合并数据集并筛选日期范围
先通过标准化名称合并,再筛选符合日期条件的记录:
# 按标准化名称合并两个数据集 merged = pd.merge(df2, df1, on='NAME_STD', how='inner') # 筛选Start_Date处于PRIOR_DATE和CREATED_DATE之间的记录 filtered = merged[ (merged['Start_Date'] >= merged['PRIOR_DATE']) & (merged['Start_Date'] <= merged['CREATED_DATE']) ]
4. 整理输出格式
调整列顺序并还原日期格式,匹配期望输出:
# 选择需要的列并调整顺序 result = filtered[['ID', 'Name', 'Start_Date', 'End_Date', 'STATUS', 'Team']] # 将日期转回原字符串格式 result['Start_Date'] = result['Start_Date'].dt.strftime('%m/%d/%Y') result['End_Date'] = result['End_Date'].dt.strftime('%m/%d/%Y') # 输出结果 print(result)
扩展方案(处理复杂名称差异)
如果存在拼写错误(如Adam vs Adem),可以使用fuzzywuzzy库做模糊匹配:
from fuzzywuzzy import process # 为df2的每个名称匹配df1中最相似的标准化名称 df2['NAME_STD'] = df2['Name'].apply( lambda x: process.extractOne(x.lower(), df1['NAME_STD'])[0] )
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

