Я предлагаю вам сделать это так:
убедитесь, что отметка времени соответствует формату даты и времени
df['timestamp'] = pd.to_datetime(df['timestamp'], infer_datetime_format=True)
Затем возьмите коды, которые происходили и выходили (если вы уверены, чтокаждый код повторяется ровно два раза, вы можете пропустить этот шаг)
df2 = df.groupby('code').filter(lambda x: x['in_out'].mean()==0.5)
Я отфильтровал со средним значением == 0,5, что означает один раз за раз, вы можете заменить его на что-то умнее Теперь давайте решим проблему
df3 = df2.groupby('code')['timestamp'].diff().dropna()
Что делает этот кусок кода, для каждого кода он вычисляет разницу во времени, тогда вы можете взять те, которые меньше 30 минут.