如何编写Python脚本匹配CSV多字段并计算日期差值?
处理CSV多字段匹配并计算日期周数差的Python方案
需求说明
需要处理两个各约3万行、列名一致的CSV文件,核心要求:
- 匹配Vendor ID、PO #、Item ID三个字段,当三者完全匹配时,对比两个文件的
Date列,计算日期的周数差 - 已掌握日期周数差的计算逻辑,需解决多字段匹配的实现问题
文件片段参考
文件1片段:
Vendor ID,PO #,Date,Item ID,Quantity TRLIM,21310023,1/18/2021,,0 TRLIM,21310023,1/18/2021,X01BJ0061,10 TRLIM,21310023,1/18/2021,X01BJ0690,15 TRLIM,21310023,1/18/2021,X01BJ0746,10 TRLIM,21310023,1/18/2021,X01CA0754,5 TRLIM,21310023,1/18/2021,X01CJ0073,10
文件2片段:
Vendor ID,PO #,Date,Item ID,Quantity TRLIM,21310023,2/8/2021,0 TRLIM,21310023,4/1/2021,X01BJ0061,10 TRLIM,21310023,1/18/2021,X01BJ0690,15 TRLIM,21310023,4/3/2021,X01BJ0746,10 TRLIM,21310023,8/7/2021,X01CA0754,5 TRLIM,21310023,6/18/2021,X01CJ0073,102
已有日期计算逻辑:
from datetime import datetime str_d1 = '2021/10/20' str_d2 = '2022/2/20' d1 = datetime.strptime(str_d1, "%Y/%m/%d") d2 = datetime.strptime(str_d2, "%Y/%m/%d") delta = (d2 - d1)/7 print(f'Difference is {delta.days} Weeks')
实现方案
针对3万行的规模,推荐用pandas实现高效的多字段匹配,步骤如下:
1. 依赖安装
如果未安装pandas,先执行:
pip install pandas
2. 完整代码实现
import pandas as pd from datetime import datetime def calculate_week_diff(date_str1, date_str2): """计算两个日期的周数差,输入格式为MM/DD/YYYY""" try: d1 = datetime.strptime(date_str1, "%m/%d/%Y") d2 = datetime.strptime(date_str2, "%m/%d/%Y") # 取整周数,若需保留小数可改为 (d2 - d1)/7 后取delta.days delta = (d2 - d1).days // 7 return delta except ValueError: return None # 处理日期格式错误的情况 # 读取两个CSV文件 df1 = pd.read_csv("file1.csv") df2 = pd.read_csv("file2.csv") # 统一空值/异常值处理:将Item ID的空字符串、0转换为NaN,确保匹配一致性 df1['Item ID'] = df1['Item ID'].replace(['', '0'], pd.NA) df2['Item ID'] = df2['Item ID'].replace(['', '0'], pd.NA) # 以三个字段为联合键进行内连接,只保留三者完全匹配的行 merged_df = pd.merge( df1, df2, on=['Vendor ID', 'PO #', 'Item ID'], suffixes=('_file1', '_file2'), how='inner' ) # 计算周数差 merged_df['Week_Difference'] = merged_df.apply( lambda row: calculate_week_diff(row['Date_file1'], row['Date_file2']), axis=1 ) # 查看结果或保存到新CSV print(merged_df[['Vendor ID', 'PO #', 'Item ID', 'Date_file1', 'Date_file2', 'Week_Difference']]) merged_df.to_csv("matched_result.csv", index=False)
代码说明
- 多字段匹配:通过
pd.merge的on参数指定三个联合字段,用inner连接只保留两边都存在的匹配记录 - 空值处理:统一转换Item ID的异常值,避免因空字符串/0导致的匹配失败
- 日期格式适配:原CSV的日期是
MM/DD/YYYY格式,所以把日期解析的格式字符串改为%m/%d/%Y - 周数计算:用自定义函数处理日期转换和差值计算,同时捕获格式错误的情况
注意事项
- 如果需要保留不匹配的行(比如只在其中一个文件存在的记录),可以把
how参数改为outer,并处理NaN值 - 3万行数据用pandas处理效率足够,无需担心性能问题
- 若存在重复的联合键记录(同一Vendor ID+PO#+Item ID出现多次),需根据业务需求决定是保留所有匹配还是去重
内容的提问来源于stack exchange,提问作者Edward Wynman
相关产品推荐
相关产品推荐

