我有两个csv文件
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
我想比较CSV-A日期/时间与CSV-B和读取Error_3列值,如果日期/时间匹配或最接近匹配。我想要的最终输出是-
CSV A -
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
CSV-A的第一行日期/时间(2023/01/01 16:45:11)在CSV-B中不匹配,这就是为什么我们检查最接近的匹配,即。'2023/01/01 16:45:10'(如果不完全匹配,通常会有1或2秒的差异)。第二行有三个精确匹配,但是我们需要读取CSV-B Error_2='SB_Data_Expiration'的值。
提前感谢您的帮助。
使用read_csv
和parse_dates
作为日期时间,然后通过参数direction='nearest'
和tolerance
传递给merge_asof
:
df1 = pd.read_csv(file1, parse_dates=[1])
df2 = pd.read_csv(file2, parse_dates=[1])
df = pd.merge_asof(df1,
df2[['Date/Time','Error_3']],
on='Date/Time',
direction='nearest',
tolerance=pd.Timedelta('3 sec'))
print (df)
Timestamp Date/Time Error_1 Error_2
0 170:02:46:928 2023-01-01 16:45:11 APP_ERR Loss_of_Data
1 170:28:37:328 2023-01-01 17:11:04 APP_ERR SB_Data_Expiration
Error_3
0 Loss_of_Data
1 ERROR