2017-10-20 49 views
2

假设我有一个pd.Series 每天 S & P 500的值,我想过滤这个系列以获得第一个营业日和相关的值每周。因此,例如,我的过滤系列将包含2017年9月5日(周二 - 周一没有价值),然后是2017年9月11日(周一)。pd.Series/DataFrame每周的第一个值

Source series: 
2017-09-01 2476.55 
2017-09-05 2457.85 
2017-09-06 2465.54 
2017-09-07 2465.10 
2017-09-08 2461.43 
2017-09-11 2488.11 
2017-09-12 2496.48 

Filtered series 
2017-09-01 2476.55 
2017-09-05 2457.85 
2017-09-11 2488.11 

我的解决方案目前包括:

mask  = SP500.apply(lambda row: SP500[row.name - datetime.timedelta(days=row.name.weekday()):].index[0], axis=1).unique() 
filtered = SP500.loc[mask] 

但是,这感觉不理想/非Python的。任何更好/更快/清洁的解决方案?

+0

为什么'2017-09-01'不包括 – Wen

+0

也许你可以创建一个熊猫数据框架并使用groupby并采用本周的第一个元素? – Michal

+0

@wen是01-09-2017将包括是的 –

回答

0

使用resamplepd.Series.index.to_series

s[s.index.to_series().resample('W').first()] 

2017-09-01 2476.55 
2017-09-05 2457.85 
2017-09-11 2488.11 
dtype: float64 
0

由于系列的.apply方法无法访问索引,并且没有axis参数,所以我不确定您提供的解决方案是否有效。你给一个数据帧会的工作,但是这是简单的,如果你有一个数据帧:

#Make some fake data 
x = pd.DataFrame(pd.date_range(date(2017, 10, 9), date(2017, 10, 23)), columns = ['date']) 
x['value'] = x.index 
print(x) 
     date value 
0 2017-10-09  0 
1 2017-10-10  1 
2 2017-10-11  2 
3 2017-10-12  3 
4 2017-10-13  4 
5 2017-10-14  5 
6 2017-10-15  6 
7 2017-10-16  7 
8 2017-10-17  8 
9 2017-10-18  9 
10 2017-10-19  10 
11 2017-10-20  11 
12 2017-10-21  12 
13 2017-10-22  13 
14 2017-10-23  14 

#filter 
filtered = x.groupby(x['date'].apply(lambda d: d-timedelta(d.weekday())), as_index = False).first() 
print(filtered) 
     date value 
0 2017-10-09  0 
1 2017-10-16  7 
2 2017-10-23  14 
1
df.sort_index().assign(week=df.index.get_level_values(0).week).drop_duplicates('week',keep='first').drop('week',1) 
Out[774]: 
       price 
2017-09-01 2476.55 
2017-09-05 2457.85 
2017-09-11 2488.11 
相关问题