如何以最小的时间间隔有效地找出两个数据帧中的公共元素?

时间:2019-07-06 02:51:12

标签: python pandas datetime

假设我有两个数据帧,即写入和读取

w:

time                address  
2018-01-01 00:00:00    8  
2018-01-01 01:00:00    2  
2018-01-01 02:00:00    5  
2018-01-01 03:00:00    3  
2018-01-01 04:00:00    4  
2018-01-01 04:30:00    5  
2018-01-01 06:00:00    5  

r:

time                    address  
2018-01-01 00:00:00        3  
2018-01-01 01:00:00        1  
2018-01-01 03:00:00        6  
2018-01-01 04:00:00        3  
2018-01-01 05:00:00        5  

时间由pd.to_datetime格式化,格式='%Y-%m-%d%H:%M:%S'

对于每个读取地址,我想获取读取地址与其最后写入地址之间的时间间隔(以秒为单位)(写入应该在读取之前进行)。如果找不到,则分配-1
对于此示例,我想获得[-1,-1,-1、3600、1800]

对于每次读取,我都会尝试反向查找w中的正确写入地址,但这很慢,是否有任何有效的方法来执行此操作?还是应该使用其他数据结构而不是pandas数据框来执行此操作?

我的代码如下:

def time_calcu(w, r):
    time_deltas = []
    for i in range(len(r)):
        for j in range(len(w) - 1, -1, -1):
            if r.iloc[i, 1] == w.iloc[j, 1] and r.iloc[i, 0] > w.iloc[j, 0]:
                t0_t1 = (r.iloc[i, 0] - w.iloc[j, 0]).total_seconds()
                time_deltas.append(t0_t1)
                break
            elif j == 0 :
                time_deltas.append(-1)


    return time_deltas

1 个答案:

答案 0 :(得分:1)

重命名列

r = r.rename(columns={'time': 'read'})
w = w.rename(columns={'time': 'write'})

使用merge_asof

m = pd.merge_asof(r, w, left_on='read', right_on='write', by='address')
m.read.sub(m.write).dt.total_seconds().fillna(-1)

0      -1.0
1      -1.0
2      -1.0
3    3600.0
4    1800.0
dtype: float64