Если даты и время отсортированы, а ожидаемый результат - только проверить, используют ли 3 последовательные даты в днях шаги в пользовательской функции в GroupBy.apply
:
df['DateEntry'] = pd.to_datetime(df['DateEntry'])
def rolling_window(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
def f(x):
vals = rolling_window(x.to_numpy(), 3)
dif = np.diff(vals, axis=1).astype("timedelta64[D]")==np.array([1], dtype='timedelta64[D]')
#print (dif)
return dif.all(axis=1).any()
s = df.groupby('Person')['DateEntry'].apply(f)
print (s)
Person
A False
B True
Name: DateEntry, dtype: bool
При необходимости также даты:
print (df)
DateEntry Person
1 2018-03-18 A
2 2018-03-19 A
3 2018-03-21 A
4 2018-08-25 B
5 2018-08-26 B
6 2018-08-27 B
7 2018-09-25 B
8 2018-09-26 B
9 2018-09-27 B
10 2018-09-30 B
df['DateEntry'] = pd.to_datetime(df['DateEntry'])
df = df.sort_values(['Person','DateEntry'])
def rolling_window(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
def f(x):
vals = rolling_window(x.to_numpy(), 3)
dif = np.diff(vals, axis=1).astype("timedelta64[D]")==np.array([1], dtype='timedelta64[D]')
return pd.DataFrame(vals[dif.all(axis=1)])
df1 = df.groupby('Person')['DateEntry'].apply(f)
print (df1)
0 1 2
Person
B 0 2018-08-25 2018-08-26 2018-08-27
1 2018-09-25 2018-09-26 2018-09-27