python - 在数据框中查找连续日期,按另一列值分组
问题描述
所以重点是找到连续 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 遍历数据帧上的行来找到答案?
我只希望显示以下输出。我不需要将结果保存在数据框中。预期输出:
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
解决方案
如果对日期时间进行排序并且预期输出仅检查是否有 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
推荐阅读
- angular - Angular - 如何从我的服务组件中的订阅返回布尔值?
- javascript - IPAD 上不显示视频
- r - 防止 Shiny selectInput 在更新反应图时过早评估
- javascript - 如何在 React.JS 中通过 className 使元素消失?
- xml - 根据 XSD 中的其他字段值定义要求字段
- java - Runtime.exec() 是否仅适用于某些命令?
- javascript - Handlebar 在控制台中返回空数据
- javascript - 将事件处理程序绑定到 React ref
- c# - 如何使用任何 Windows 自动化向 Outlook 文本框添加一些文本?
- excel - 宏在无限循环中运行