У меня есть такой фрейм данных
data = {
"timeStamp": ['06:00:00', '06:03:00', '06:10:00', '06:30:00', '06:32:00', '06:02:00', '06:05:00', '06:06:00', '06:55:00', '06:00:00', '06:01:00', '06:20:00', '07:00:00'],
"Event": ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'D']
}
df = pd.DataFrame(data)
Мне нужно знать кратчайшие интервалы, содержащие 3 или более строк в каждой группе.
В данном примере мы видим:
Желаемый результат выглядит так
...
и т. д.
Есть ли какой-нибудь элегантный способ сделать это?
Пожалуйста, понятно объясните логику. Также укажите точный ожидаемый результат, учитывая ваш небольшой пример.
Определены ли ваши интервалы определенным образом, например. регулярный интервал в 2 минуты? Может быть, это поможет вам?
Извините за беспорядок в первой версии вопроса. Теперь я постарался лучше объяснить, что мне нужно получить.
Вы можете groupby("Event")
а затем применить собственную функцию агрегирования.
# Convert to datetime to compute intervals
df['timeStamp'] = pd.to_datetime(df['timeStamp'])
def find_shortest_interval_3(group):
if len(group) < 3:
return None
group = group.sort_values('timeStamp')
min_interval = pd.Timedelta.max
for i in range(len(group) - 2): # You can parameterize this so that its not always 3
current_interval = group.iloc[i+2]['timeStamp'] - group.iloc[i]['timeStamp']
if current_interval < min_interval:
min_interval = current_interval
return min_interval
print(df.groupby('Event').apply(find_shortest_interval_3))
Выход:
Event
A 0 days 00:10:00
B 0 days 00:04:00
C 0 days 00:20:00
D NaT
Пожалуйста, объясните лучше свою логику. Интервал между какими событиями?