pd.Series / DataFrame中每周的第一个值

时间:2017-10-20 17:42:10

标签: python pandas datetimeindex

假设我有每日 S& P 500值的pd.Series系列,我想过滤此系列以获取第一个工作日以及每周的相关值。

因此,例如,我的过滤系列将包含2017年9月5日(星期二 - 周一没有价值),然后是2017年9月11日(星期一)。

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]
然而,这感觉次优/非pythonic。更好/更快/更清洁的解决方案?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我不确定您提供的解决方案是否有效,因为系列的.apply方法无法访问索引,并且没有轴参数。您提供的内容适用于DataFrame,但如果您有数据框,则更简单:

#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

答案 2 :(得分:0)

resample上使用pd.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