我需要为整个数据框架每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