匹配或最接近匹配两个dataframe datetime列,并且只从第二个dataframe读取一个列值



我有两个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_csvparse_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  

相关内容

最新更新