匹配或近似匹配CSV时间列,提取符合条件的指定列数据
CSV文件匹配与Error_3列提取实现方案
需求说明
我们需要基于以下规则,从CSV B中提取Error_3列的值补充到CSV A中:
- 精确匹配优先:当CSV A某行的
Date/Time与CSV B中某行的Date/Time完全一致时,筛选CSV B中Error_2与CSV A该行相同的记录,提取其Error_3值 - 近似匹配兜底:若没有精确匹配的记录,选择CSV B中与CSV A该行时间差最小(通常1-2秒内)的记录,提取其
Error_3值
示例数据
CSV A(原始数据)
Timestamp,Date/Time,Error_1,Error_2 170:02:46:928,2023/01/01 16:45:11,APP_ERR,Loss_of_Data 170:28:37:328,2023/01/01 17:11:04,APP_ERR,SB_Data_Expiration
CSV B(数据源)
Timestamp,Date/Time,Error_1,Error_2,Error_3 170:02:46:928,2023/01/01 16:45:07,APP_ERR,Loss_of_Data,NO_ERROR 170:14:40:928,2023/01/01 16:45:10,APP_ERR,Loss_of_Data,Loss_of_Data 170:28:16:928,2023/01/01 17:10:44,APP_ERR,Cnx_Attempt,NO_ERROR 170:28:37:328,2023/01/01 17:11:04,APP_ERR,SB_Data_Expiration,ERROR 170:29:57:728,2023/01/01 17:11:04,APP_ERR,PEB_due_to_overlimit,Due_to_Over_SBI 170:32:59:978,2023/01/01 17:11:04,APP_ERR,Cnx_Attempt,NO_ERROR 170:33:40:778,2023/01/01 17:16:08,APP_ERR,Cnx_Attempt,NO_ERROR
预期输出
Timestamp,Date/Time,Error_1,Error_2,Error_3 170:02:46:928,2023/01/01 16:45:11,APP_ERR,Loss_of_Data,Loss_of_Data 170:28:37:328,2023/01/01 17:11:04,APP_ERR,SB_Data_Expiration,ERROR
代码实现(Python + Pandas)
用Pandas处理时间转换和匹配逻辑,代码如下:
import pandas as pd # 读取CSV文件 df_a = pd.read_csv('csv_a.csv') df_b = pd.read_csv('csv_b.csv') # 将Date/Time列转换为datetime类型,方便时间计算 df_a['datetime'] = pd.to_datetime(df_a['Date/Time'], format='%Y/%m/%d %H:%M:%S') df_b['datetime'] = pd.to_datetime(df_b['Date/Time'], format='%Y/%m/%d %H:%M:%S') def get_error_3(row): # 第一步:尝试精确匹配(时间+Error_2) exact_match = df_b[(df_b['datetime'] == row['datetime']) & (df_b['Error_2'] == row['Error_2'])] if not exact_match.empty: return exact_match.iloc[0]['Error_3'] # 第二步:无精确匹配时,找时间差最小的记录 df_b['time_diff'] = abs(df_b['datetime'] - row['datetime']) closest_row = df_b.loc[df_b['time_diff'].idxmin()] return closest_row['Error_3'] # 为CSV A添加Error_3列 df_a['Error_3'] = df_a.apply(get_error_3, axis=1) # 移除临时的datetime列,保留原始结构 result = df_a.drop(columns=['datetime']) # 输出结果到CSV result.to_csv('result.csv', index=False) print(result)
代码说明
- 时间格式转换:将
Date/Time转为datetime类型,支持时间差计算和精确匹配 - 精确匹配逻辑:同时匹配时间和
Error_2字段,确保提取对应记录的Error_3 - 近似匹配逻辑:计算CSV B所有记录与当前行的时间差,取最小差值对应的记录的
Error_3 - 结果输出:移除临时列后,将结果保存为新的CSV文件,同时打印控制台预览
内容的提问来源于stack exchange,提问作者RKIDEV
相关产品推荐
相关产品推荐

