Pandas resample 在将每日数据转换为每月数据时创建不在索引中的新日期

Pandas resample creates new dates not in index when converting daily data to monthly data

import yfinance as yf
import pandas as pd 

data = yf.download('SPY', start='2017-12-31', end='2019-12-31') 
df = data[['Adj Close']] 

df.resample('2Q',closed='left').mean() 

resample 的输出显示季度末日期 30-06-2018、31-12-2018、30-06-2019 和 31-12-2019。但其中一些日期不在原始数据中。平均值计算正确。

这些应该是正确的日期 29-06-2018、31-12-2018、28-06-2019、30-12-2019。

如何使用重新采样但输出原始数据中的正确日期?

f = {'Date': 'last', 'Adj Close': 'mean'}
df.reset_index().groupby([[d.year for d in df.index],[d.month==6 for d in 
df.index]],as_index=False).agg(f).sort_values('Date')

我使用了 groupby,它输出了正确的日期(即原始数据中季度的最后一个日期),但平均值计算错误。这是为什么?

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

2018 年 12 月 31 日已分配给 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

2018 年 12 月 31 日已分配给 2018 年第四季度。