python - 一旦遇到一行,在 40 天内删除所有行,然后重复
问题描述
我有以下数据框,按 ID 和 Date 排序:
东风:
ID Date
A 2019-01-02
A 2019-02-09
A 2019-02-20
A 2019-02-27
A 2019-03-16
A 2019-03-29
A 2019-04-17
A 2019-04-19
A 2019-05-26
A 2019-06-12
B 2017-01-01
B ...
我想要的是,当我遇到一行时,在接下来的 40 天内删除所有带有日期的行,并从我遇到的下一个(未删除的)行开始重复。我想要每个ID。
例如 ID=A :
- 我遇到第一行,日期是
2019-01-02
。40 天后 is2019-02-11
,所以我严格删除这两个日期之间的所有 Date 行。所以第二行被删除 (Date =2019-02-09
) Date >= 2019-02-11
然后,我用(2019-02-11
是前 40 天期限的结束)查找下一行。我找到第三行,日期 =2019-02-20
。这是现在的参考日期,40 天后是2019-04-01
。所以第 4、5、6 行被删除- ...
请注意,我的 40 天期限是从我遇到新行时开始的,并且当前没有 40 天期限处于活动状态。因此,对于所有 ID,这些时间段并不相同。
这给出了以下输出数据集
ID Date
A 2019-01-02
A 2019-02-20
A 2019-04-17
A 2019-06-12
B 2017-01-01
B ...
提前致谢
解决方案
您可以遍历数据框以创建过滤器
import pandas as pd
import datetime
# create your dataframe "df" here...
# with columns "ID" and "Date"
# make sure your Date is a datetime field!
df['Date'] = pd.to_datetime(df['Date'])
prev_id = None
prev_date = None
keep_rows = []
for _, row in df.iterrows():
if row['ID'] == prev_id:
delete = (row['Date'] - prev_date) < datetime.timedelta(days=40)
if delete:
keep_rows.append(False)
continue
keep_rows.append(True)
prev_id = row['ID']
prev_date = row['Date']
并像这样过滤您的数据框
df[keep_rows]
推荐阅读
- applitools - 阅读故事时出错:故事书加载时间过长
- c++ - 如何在 pcl 查看器中的点之间绘制样条线或曲线?
- oracle - 如何一次将oracle sql中的所有查询结果保存到pdf文件
- reactjs - 哪个最好通过 setState 或从自定义钩子(React)返回状态值
- python - Discord Python - 有没有办法让机器人从另一个机器人读取命令,还是我们必须将整个事情更改为 on_message 事件?
- ios - Firebase Crashlytics MacOS - AppKit 下的所有崩溃
- wordpress - wordpress 自定义用户管理和会员在前面没有插件
- environment-variables - 如何在 zsh 中设置环境变量名称的完成?
- join - 雪花加入性能改进
- django - Django- Group by 和 Count by unique together