假设我有两个数据帧,即写入和读取
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
答案 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