Это сложная проблема! Я могу предложить вам частичное решение, которое, надеюсь, будет достаточным для начала работы.
Вам следует изучить rolling
методы панд, которые могут использовать ваш индекс DateTime. Обратите внимание, что, насколько я знаю, функции прокрутки могут смотреть только на предыдущий период, а не на будущий период. Это решение вычисляет количество экземпляров столбца bar
, которое появилось за последние 20 минут, в соответствии с набором времени объединения foo
и bar
, которое, как я полагаю, является тем, о чем вы просите.
import pandas as pd
import numpy as np
# Attempting to generate some similar data
np.random.seed(0)
rng = pd.date_range('4/1/2013', periods=1000, freq='5T', name='Date')
df = pd.DataFrame({'Variable': np.random.choice(['S', 'A'], 1000)}, index=rng)
df1 = df.sample(frac=0.5)
df2 = df.sample(frac=0.5)
merged = df1.merge(df2, how='outer', left_index=True, right_index=True, suffixes=['_foo', '_bar'])
# pandas can't found objects, but can count bools
m = merged.notnull()
# Rolling functions can't count "after", only "before" or "center"
merged['Nr_20_bef'] = m.Variable_bar.rolling('20T').sum()
print(merged.head(10))
Variable_foo Variable_bar Nr_20_bef
# Date
# 2013-04-01 00:05:00 A NaN 0.0
# 2013-04-01 00:10:00 A NaN 0.0
# 2013-04-01 00:15:00 NaN S 1.0
# 2013-04-01 00:20:00 A A 2.0
# 2013-04-01 00:25:00 A NaN 2.0
# 2013-04-01 00:40:00 NaN A 1.0
# 2013-04-01 00:45:00 A A 2.0
# 2013-04-01 00:50:00 NaN A 3.0
# 2013-04-01 01:05:00 NaN A 2.0
# 2013-04-01 01:10:00 S S 2.0
Генерация столбца Nr_20_bef
выполняется очень быстро: ~ 1 секунда для 10 миллионов строк на моем двухлетнем ноутбуке. Например, если вы хотите считать только символы «S», вместо этого вы можете сделать m = merged == 'S'
.