簡體   English   中英

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

[英]First value of each week in pd.Series/DataFrame

假設我有一個 pd.Series每日標准普爾 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。 任何更好/更快/更清潔的解決方案?

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

使用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

我不確定您提供的解決方案是否有效,因為系列的 .apply 方法無法訪問索引,並且沒有軸參數。 您提供的內容適用於數據幀,但如果您有數據幀,這會更簡單:

#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM