Python 在数据框中查找按另一列值分组的连续日期

Python 在数据框中查找按另一列值分组的连续日期,python,pandas,dataframe,date,datetime,Python,Pandas,Dataframe,Date,Datetime,因此,关键是要找到在连续3次约会中输入的人。 我的框架如下所示: DateEntry Person 1 2018-03-18 A 2 2018-03-19 A 3 2018-03-21 A 4 2018-09-25 B 5 2018-09-26 B 6 2018-09-27 B 我知道如何检查的唯一方法是将日期更改为字符串列表,然后进行检查。 它工作正常,但不允许使用这种方法

因此,关键是要找到在连续3次约会中输入的人。 我的框架如下所示:

        DateEntry    Person
1       2018-03-18   A
2       2018-03-19   A
3       2018-03-21   A
4       2018-09-25   B
5       2018-09-26   B
6       2018-09-27   B
我知道如何检查的唯一方法是将日期更改为字符串列表,然后进行检查。 它工作正常,但不允许使用这种方法

有没有一种方法可以通过pandas遍历数据帧上的行来找到答案

我只希望显示以下输出。我不需要将结果保存在dataframe中。 预期产出:

Person A did not enter on 3 consecutive days.

Person B did enter on three consecutive days.
Consecutive days entered by person B:
2018-09-25
2018-09-26
2018-09-27
请尝试以下代码:

将熊猫作为pd导入
从日期时间导入日期时间
数据=['2018-03-18','A'],
['2018-03-19','A'],
['2018-03-21','A'],
['2018-09-25','B'],
['2018-09-26','B'],
['2018-09-27','B']]
df=pd.DataFrame(数据,列=['DateEntry','Person'])
人=无
日期=无
计数=0
对于索引,df.iterrows()中的行:
如有人:
如果Person==行['Person']:
计数+=1
其他:
Person=行['Person']
日期=无
计数=0
其他:
Person=行['Person']
计数+=1
如果日期:
如果(datetime.strptime(第['DateEntry']行,%Y-%m-%d”)-datetime.strptime(日期,%Y-%m-%d”)。天==1:
日期=行['DateEntry']
如果计数=3:
打印('连续访问者为--{}'。格式(个人))
其他:
人=无
日期=无
计数=0
其他:
日期=行['DateEntry']

如果对日期时间进行了排序,且预期输出为,则仅检查是否在中的自定义函数中使用了3个连续的日期(以天为单位):

如果还需要日期时间:

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



您在这里的预期输出是什么?DateEntry列是否总是被排序?同一个人在一行中是否总是至少有三个条目?我现在编辑它以显示预期的输出。谢谢你的更正!每组总是有3个值?不一定,有些人,比如说C和D有4-5个日期的条目。我只需要找到至少3天内进入的人。所以>=3.Super,所以我的答案应该很有效。如果还需要datetimes,请为解决方案工作。
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