У меня есть DataFrame pandas с временем начала и окончания (datetime.time) для списка процессов:
from datetime import time
import pandas as pd
df = pd.DataFrame(columns=['start', 'end'],
index=pd.Index(['proc01', 'proc02'], name='Processes'),
data=[
[time(10), time(14)],
[time(12), time(16)]
])
Я хочу преобразовать эту информацию в гистограмму, которая подсчитывает, сколько процессов запущено:
>>> bins = pd.date_range('08:00', '22:00', freq='1H').time
>>> count_processes(df, bins)
array([0, 0, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0])
У меня есть реализация, но она довольно медленная для больших фреймов данных (около 2-3 миллионов строк), я хотел бы знать, есть ли способ ее векторизации или, по крайней мере, сделать ее более быстрой:
def count_processes(df, bins):
result = np.zeros_like(bins, dtype=int)
for _, row in df.iterrows():
aux = (row['start'] <= bins) & (bins < row['end'])
result += aux.astype(int)
return result