Мне интересно, как я могу ускорить слияние двух фреймов данных. В одном из информационных кадров установлены временные метки данных (value
col).Merge pandas DataFrames на основе нерегулярных временных интервалов
import pandas as pd
import numpy as np
data = pd.DataFrame({'time':np.sort(np.random.uniform(0,100,size=50)),
'value':np.random.uniform(-1,1,size=50)})
Другой имеет информацию временной интервал (start_time
, end_time
и связанные с ними interval_id
).
intervals = pd.DataFrame({'interval_id':np.arange(9),
'start_time':np.random.uniform(0,5,size=9) + np.arange(0,90,10),
'end_time':np.random.uniform(5,10,size=9) + np.arange(0,90,10)})
Я хотел бы объединить эти два dataframes более эффективно, чем for
петли ниже:
data['interval_id'] = np.nan
for index, ser in intervals.iterrows():
in_interval = (data['time'] >= ser['start_time']) & \
(data['time'] <= ser['end_time'])
data['interval_id'][in_interval] = ser['interval_id']
result = data.merge(intervals, how='outer').sort('time').reset_index(drop=True)
Я продолжаю воображать, я буду в состоянии использовать панд time series functionality, как диапазон дат или TimeGrouper , но мне еще предстоит выяснить что-нибудь более питоническое (панда-у?), чем выше.
Пример результата:
time value interval_id start_time end_time
0 0.575976 0.022727 NaN NaN NaN
1 4.607545 0.222568 0 3.618715 8.294847
2 5.179350 0.438052 0 3.618715 8.294847
3 11.069956 0.641269 1 10.301728 19.870283
4 12.387854 0.344192 1 10.301728 19.870283
5 18.889691 0.582946 1 10.301728 19.870283
6 20.850469 -0.027436 NaN NaN NaN
7 23.199618 0.731316 2 21.488868 28.968338
8 26.631284 0.570647 2 21.488868 28.968338
9 26.996397 0.597035 2 21.488868 28.968338
10 28.601867 -0.131712 2 21.488868 28.968338
11 28.660986 0.710856 2 21.488868 28.968338
12 28.875395 -0.355208 2 21.488868 28.968338
13 28.959320 -0.430759 2 21.488868 28.968338
14 29.702800 -0.554742 NaN NaN NaN
Любые предложения от временных рядов подкованных людей там было бы весьма признателен.
Update, после того, как ответ Джеффа:
Основная проблема заключается в том, что interval_id
не имеет никакого отношения к какому-либо регулярному временному интервалу (например, интервалы не всегда около 10 секунд). Один интервал может составлять 10 секунд, следующий может составлять 2 секунды, а следующий может составлять 100 секунд, поэтому я не могу использовать какую-либо регулярную схему округления, как предложил Джефф. К сожалению, мой минимальный пример выше не делает этого ясным.
ли интервалы всегда пересекаются? – unutbu
В этом случае да, интервалы всегда не пересекаются. Было бы интересно найти решение для перекрытия интервалов, теперь, когда вы спрашиваете! – pedmiston