Как эффективно определить общие элементы в двух информационных рамках с минимальным временным интервалом? - PullRequest
1 голос
/ 06 июля 2019

Предположим, у меня есть два кадра данных: запись и чтение

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 dataframe, чтобы сделать это?

Мой код указан ниже:

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 Ответ

1 голос
/ 06 июля 2019

Переименовать столбцы

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...