a) df.resample('2Q', closed='left').mean()
дает
Adj Close
Date
2018-06-30 260.626654
2018-12-31 268.594670
2019-06-30 273.702913
2019-12-31 297.780020
, что эквивалентно
pd.DataFrame({'Date': ['2018-06-30', '2018-12-31', '2019-06-30', '2019-12-31'],
'Adj Close': [df[(df.index <= '2018-06-29')].mean().values[0],
df[(df.index > '2018-06-29') & (df.index < '2018-12-31')].mean().values[0],
df[(df.index >= '2018-12-31') & (df.index <= '2019-06-28')].mean().values[0],
df[(df.index > '2019-06-28')].mean().values[0]]})
Date Adj Close
0 2018-06-30 260.626654
1 2018-12-31 268.594670
2 2019-06-30 273.702913
3 2019-12-31 297.780020
, где 31 декабря 2018 года был присвоен Q1 2019.
b ) df.resample('2Q', kind='period').mean()
дает
Adj Close
Date
2018Q1 260.626654
2018Q3 268.398217
2019Q1 273.943730
2019Q3 297.780020
, что эквивалентно
pd.DataFrame({'Date': ['2018Q1', '2018Q3', '2019Q1', '2019Q3'],
'Adj Close': [df[(df.index <= '2018-06-29')].mean().values[0],
df[(df.index > '2018-06-29') & (df.index <= '2018-12-31')].mean().values[0],
df[(df.index > '2018-12-31') & (df.index <= '2019-06-28')].mean().values[0],
df[(df.index > '2019-06-28')].mean().values[0]]})
Date Adj Close
0 2018Q1 260.626654
1 2018Q3 268.398217
2 2019Q1 273.943730
3 2019Q3 297.780020
, а также
f = {'Date': 'last', 'Adj Close': 'mean'}
df.reset_index().groupby([[d.year for d in df.index], [d.quarter <= 2 for d in df.index]], as_index=False).agg(f).sort_values('Date')
Date Adj Close
1 2018-06-29 260.626654
0 2018-12-31 268.398217
3 2019-06-28 273.943730
2 2019-12-30 297.780020
, где 31 декабря 2018 года был присвоен Q4 2018.