Python 将事件日志映射到数据库中的间隔日志

Python 将事件日志映射到数据库中的间隔日志,python,pandas,Python,Pandas,我有两个表,一个事件日志和一个间隔日志 import pandas as pd interval_log = {'interval_id':['AG21234', 'AG21236', 'AS21234'], 'start_utc':['2016-01-01 10:30:50', '2016-03-20 09:31:50', '2016-06-20 21:12:30'], 'end_utc':['2016-01-02 12:41:00', '201

我有两个表,一个事件日志和一个间隔日志

import pandas as pd
interval_log = {'interval_id':['AG21234', 'AG21236', 'AS21234'], 
           'start_utc':['2016-01-01 10:30:50', '2016-03-20 09:31:50', '2016-06-20 21:12:30'], 
           'end_utc':['2016-01-02 12:41:00', '2016-03-20 10:12:32', '2016-06-20 23:32:21']}
interval_table = pd.DataFrame(interval_log)

event_log = {'event_id':[12334,13242, 43251, 32123, 43213, 43215, 34221],
         'timestamp':['2016-01-01 10:30:51', '2016-01-01 10:31:51', '2016-01-01 10:35:51',
                      '2016-03-20 09:35:12', '2016-03-20 09:40:23', 
                      '2016-06-20 22:10:30', '2016-06-20 22:21:12'],
        'event_class':['A', 'B', 'A', 'C', 'B', 'D', 'A'],
        'event_cause':['A1', 'B1', 'A2', 'C4', 'B34', 'D32', 'A12']    }
event_table = pd.DataFrame(event_log)

interval_table.start_utc = pd.to_datetime(interval_table.start_utc)
interval_table.end_utc = pd.to_datetime(interval_table.end_utc)
event_table.timestamp = pd.to_datetime(event_table.timestamp)
我试图做的是在
事件日志中的每个条目中添加
间隔\u id
当前的工作代码是:

result = []
for counter, interval in interval_table.iterrows():
    subset = event_table[(event_table.timestamp > interval.start_utc) & 
                   (event_table.timestamp < interval.end_utc) ]
    subset['interval_id'] = interval.interval_id
    result.append([subset])
result=[]
对于计数器,间隔_表中的间隔。iterrows()
子集=事件表[(事件表.timestamp>interval.start\u utc)&
(event_table.timestamp
它适用于这种简单的情况,但在实际数据集上,事件日志约为900万行,间隔约为300万行,它的运行效率非常低


最好的解决方案是什么?

我刚刚了解了
merge\u asof
的功能:

对于左侧数据框中的每一行,我们选择 右数据帧,其“开”键小于或等于左数据帧 钥匙两个数据帧必须按键排序

两个数据帧必须按其键排序

pd.merge_asof(event_table, interval_table, left_on='timestamp', right_on='start_utc')
使用0.19

pd.merge_asof(
    event_table, interval_table,
    left_on='timestamp', right_on='start_utc'
).drop(['end_utc', 'start_utc'], 1)