过滤掉前一个表项30个周期内的值



我需要为整个数据框架每30天选择一个值。例如,如果我有以下数据帧:

p>
Date        Value
0  2015-09-25   e
1  2015-11-11   b
2  2015-11-24   c
3  2015-12-02   d
4  2015-12-14   a
5  2016-02-01   b
6  2016-03-23   c 
7  2016-05-02   d 
8  2016-05-25   a  
9  2016-06-15   a  
10  2016-06-28  a  

我需要选择第一个条目,然后过滤掉该条目后30天内的任何条目,然后沿着数据框继续。例如,索引0和1应该保留,因为它们相距至少30天,但2和3距离1不到30天,因此应该删除它们。这应该按时间顺序继续,直到我们每30天有一个条目:

Date        Value
0  2015-09-25   e
1  2015-11-11   b
4  2015-12-14   a
5  2016-02-01   b
6  2016-03-23   c 
7  2016-05-02   d  
9  2016-06-15   a  

最终结果每30天只有1个条目。任何建议或帮助将不胜感激!

我尝试了df.groupby(pd.Grouper(freq='M')).first(),但它选择每个月的第一个条目,而不是每个条目,从前一个条目至少30天。

我想出了一个简单的迭代解决方案,它使用了DF是排序的事实,但它相当慢:

index = df.index.values
dates = df['Date'].tolist()
index_to_keep = []
curr_date = None
for i in range(len(dates)):
if not curr_date or (dates[i] - curr_date).days > 30:
index_to_keep.append(index[i])
curr_date = dates[i]
df_out = df.loc[index_to_keep, :]
return df_out

有什么加快速度的办法吗?

我想这应该是你要找的。

您需要将日期列转换为datetime数据结构,而不是将其解释为字符串。

是这样的:

df = pd.DataFrame({'Date': ['2015-09-25', '2015-11-11','2015-11-24', '2015-12-02','2015-12-14'],
'Value' : ['e', 'b', 'c','d','a']})
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')
df = df.groupby(pd.Grouper(freq='30D')).nth(0)

,这里是结果

Value
Date            
2015-09-25     e
2015-10-25     b
2015-11-24     c

最新更新