Итак, у меня есть исходный фрейм данных pandas с примерно 300 000 временных меток и еще один с 1000 временных интервалов (два столбца, один с началом и один с остановкой). Я хочу создать новый столбец в исходном фрейме данных, где каждому значению столбца присваивается номер в зависимости от того, была ли найдена временная метка строки в пределах указанного c временного интервала (число должно быть значением индекса временного интервала). Значения столбцов временных меток, которые не найдены ни в одном временном интервале, должны быть установлены на NaN.
Вот что я сделал до сих пор:
conditions = [
(Stamps['date_time_utc'] >= Intervals['Start'][0]) & (Stamps['date_time_utc'] <= Intervals['Stop'][0]),
(Stamps['date_time_utc'] >= Intervals['Start'][1]) & (Stamps['date_time_utc'] <= Intervals['Stop'][1]),
(Stamps['date_time_utc'] >= Intervals['Start'][2]) & (Stamps['date_time_utc'] <= Intervals['Stop'][2])
]
choices = [0,1,2]
Stamps['Interval ID'] = np.select(conditions, choices, default=np.NaN)
Stamps['Interval ID'].value_counts()
Output:
2.0 942
0.0 617
1.0 525
Name: Interval ID, dtype: int64
Это работает как надо . Проблема в том, что когда у меня есть тысяча временных интервалов, я, очевидно, не хочу выписывать условие для каждого из них. Это то, что я пробовал, но безуспешно:
Stamps['Interval ID'] = np.NaN
for idx, i in enumerate(zip(Intervals['Start'],Intervals['Stop'])):
conditions = [
(Stamps['date_time_utc'] >= i[0]) & (Stamps['date_time_utc'] <= i[1]),
]
choices = [idx]
Stamps['Interval ID'] = np.select(conditions, choices, default=NaN)
FYI Times в обоих фреймах данных имеет dtype: object.
Как я могу сделать это эффективным и понятным способом?