You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:54:23