yr_idx = pd.date_range(start='2005-01-30', 
                       end='2008-02-02', freq='D')
data = np.random.rand(len(yr_idx))
df = pd.DataFrame(index=yr_idx, data=data, columns=['a'])
month_num_to_season =   { 1:'DJF',  2:'DJF', 
                          3:'MAM',  4:'MAM',  5:'MAM', 
                          6:'JJA',  7:'JJA',  8:'JJA',
                          9:'SON', 10:'SON', 11:'SON',
                         12:'DJF'}
grouped =  df.groupby(lambda x: month_num_to_season.get(x.month))                      
low_bounds = grouped.quantile(FRAC_2_TAIL)
high_bounds = grouped.quantile(1 - FRAC_2_TAIL)
  
DJF   0.021284
JJA   0.024769
MAM   0.030149
SON   0.041784
   但在我的频率上花了很长时间,十年,数据集。
    TimeGrouper
   我想要的:
  gp_time = df.groupby(pd.TimeGrouper('QS-DEC'))
low_bounds = gp_time.agg(lambda x: x.quantile(FRAC_2_TAIL)) 
  2004-12-01  0.036755
2005-03-01  0.034271
2007-09-01  0.098833
2007-12-01  0.068948
   我也试着做一个
    freq='QS-DEC'
    df.index.freq
   并在此基础上分组。它很慢,记忆也很重。
   好像我遗漏了一些显而易见的东西。
   根据@JohnE的评论
   在groupby中查找需要时间。使用5年的分钟数据:
  %%timeit
grouped =  df.groupby(lambda x: month_num_to_season.get(x.month)) 
> 13.3 s per loop
   分位数计算很快:
  %%timeit
low_bounds = grouped.quantile(FRAC_2_TAIL)
> 2.94 ms per loop
   添加一个季节列并对其进行分组在总体时间上是相似的。再次被
  SEAS = 'season'
%%timeit
df[SEAS] = [month_num_to_season.get(t_stamp.month) for t_stamp in df.index]
> 13.1 s per loop
%%timeit
gp_on_col = df.groupby(SEAS)
> 10000 loops, best of 3: 62.7 µs per loop
%%timeit
gp_on_col.quantile(FRAC_2_TAIL)
> 753 ms per loop
   我重新实现了制作季度数据框架的方法,以最小化
  SEASON_HALO = pd.datetools.relativedelta(months=4)
start_with_halo = df.index.min() - SEASON_HALO
end_with_halo = df.index.max() + SEASON_HALO
> 84.1 µs per loop
seasonal_idx = pd.DatetimeIndex(start=start_with_halo, end=end_with_halo, freq='QS-DEC')
seasonal_ts = pd.DataFrame(index=seasonal_idx)
> 440 µs per loop
seasonal_ts[SEAS] = [month_num_to_season.get(t_stamp.month) for t_stamp in seasonal_ts.index]
> 1.25 s per loop
seasonal_minutely_ts = seasonal_ts.resample(df.index.freq, fill_method='ffill')
> 5.12 ms per loop
df_via_resample = df.join(seasonal_minutely_ts)
> 47 ms per loop
gp_up_sample = df_via_resample.groupby(SEAS)
> 63.4 µs per loop
gp_up_sample.quantile(FRAC_2_TAIL)
> 834 ms per loop
   对于其他方法来说,大约是2秒对13秒。