2

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

因此,例如,我过滤的系列将包含 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。有更好/更快/更清洁的解决方案吗?

4

3 回答 3

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
于 2017-10-20T19:39:40.927 回答
1

使用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
于 2017-10-20T23:04:26.443 回答
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
于 2017-10-20T18:38:34.797 回答