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 年第四季度。
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 年第四季度。