Python 在数据框中查找按另一列值分组的连续日期
因此,关键是要找到在连续3次约会中输入的人。 我的框架如下所示: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 我知道如何检查的唯一方法是将日期更改为字符串列表,然后进行检查。 它工作正常,但不允许使用这种方法
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