我有一个 pandas 数据框,如下所示:
ID date close
1 09/15/07 123.45
2 06/01/08 130.13
3 10/25/08 132.01
4 05/13/09 118.34
5 11/07/09 145.99
6 11/15/09 146.73
7 07/03/11 171.10
我想删除任何重叠的行。
重叠行定义为另一行 X 天内的任何行。例如,如果 X = 365,则结果应为:
ID date close
1 09/15/07 123.45
3 10/25/08 132.01
5 11/07/09 145.99
7 07/03/11 171.10
如果 X = 50,结果应为:
ID date close
1 09/15/07 123.45
2 06/01/08 130.13
3 10/25/08 132.01
4 05/13/09 118.34
5 11/07/09 145.99
7 07/03/11 171.10
我已经看了这里的几个问题,但还没有找到正确的方法。例如,Pandas 检查多行中的重叠日期 https://stackoverflow.com/questions/36654198/pandas-check-for-overlapping-dates-in-multiple-rows and 从 pandas 数据框中消除特定日期的最快方法 https://stackoverflow.com/questions/37307796/fastest-way-to-eliminate-specific-dates-from-pandas-dataframe很相似,但不太能满足我的需要。
我今天有以下丑陋的代码,适用于较小的 X 值,但当 X 变大时(例如,当 X = 365 时),它会删除除原始日期之外的所有日期。
filter_dates = []
for index, row in df.iterrows():
if observation_time == 'D':
for i in range(1, observation_period):
filter_dates.append((index.date() + timedelta(days=i)))
df = df[~df.index.isin(filter_dates)]
任何帮助/指示将不胜感激!
澄清:
解决这个问题需要查看每一行,而不仅仅是第一行。
您可以添加新列来过滤结果:
df['filter'] = df['date'] - df['date'][0]
df['filter'] = df['filter'].apply(lambda x: x.days)
然后要按 365 进行过滤,请使用以下命令:
df[df['filter']%365==0]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)