将每日数据重采样成月数据框?

3

我有一个每日的数据框,我正在尝试使用resample将其重采样以获得每月的Open High Low Close

daily_df

            Open   High    Low   Last  Close

Date                                         

2010-01-04  55.15  57.55  54.55  57.50  57.30

2010-01-05  59.70  59.70  57.45  57.90  58.00

2010-01-06  60.30  60.30  57.10  57.55  57.50

2010-01-07  60.25  60.25  57.35  58.85  58.90

2010-01-08  59.40  59.95  56.90  57.30  57.65

2010-01-11  57.30  57.95  56.00  56.25  56.25

2010-01-12  56.25  56.80  53.80  54.25  54.10

2010-01-13  54.00  55.00  52.15  54.90  54.85

2010-01-14  55.45  55.70  54.15  54.30  54.35

2010-01-15  54.60  55.30  54.00  54.30  54.30

2010-01-18  53.90  55.20  53.85  54.35  54.40

2010-01-19  54.60  55.20  53.55  53.65  53.75

2010-01-20  54.40  54.40  53.45  53.60  53.70

2010-01-21  53.85  53.85  51.95  52.10  52.25

2010-01-22  51.80  52.85  50.30  51.85  52.00

2010-01-25  52.50  52.50  50.50  50.70  50.85

2010-01-27  51.25  51.25  47.80  47.90  48.20

2010-01-28  48.55  50.50  47.10  47.45  47.35

2010-01-29  47.45  52.15  45.60  51.80  51.70

2010-02-01  51.80  52.40  50.50  51.50  51.45

2010-02-02  53.25  54.10  51.40  51.80  51.80

2010-02-03  51.60  52.90  51.50  51.85  51.95

我已经尝试过:

df2 = df_daily.resample('M',convention='end').asfreq()

这将给我一个仅包含收盘价的数据帧,即如果日期恰好为月底,则为开盘价高价低价收盘价的第30个值,否则为NaN

df2=df_daily.resample('M').mean()

这将产生一个数值,我认为它是某个月份Open High Low Close值的平均/平均值。
我希望能够从价格可用的那个月的第一天得到该月份的Open值,高值为该月份的最高值,低值为该月份的最低值,Close为实际收盘价。
我相信我可以使用pandas中的min max以不同的方式完成这项任务,但我只是想知道是否可以使用重新采样来完成这项任务。
期望的 df:
         Open   High    Low   Close

Date                                         

2010-01-29  55.15  60.3  45.6  51.7

谢谢


你能发布一下你期望的输出df吗? - Pyd
@pyd,已编辑问题。 - Sid
1个回答

7

按月重新采样会考虑每个列日期的最后一天。

df2 = df_daily.resample('M').agg({'Open':'first', 'High':'max', 
                                      'Low': 'min', 'Close':'last'})

输出:

            Open    High    Low    Close
Date                
2010-01-31  55.15   60.3    45.6    51.70
2010-02-28  51.80   54.1    50.5    51.95

您可以将索引更改为列中的最后一天:

df2 = df_daily.resample('M').agg({'Open':'first', 'High':'max', 
                                      'Low': 'min', 'Close':'last'})

idx = df_daily.reset_index().groupby(df_daily.index.to_period('M'))['Date'].idxmax()
df2.index = df_daily.iloc[idx].index
print(df2)

Output:

            Open    High    Low    Close
Date                
2010-01-29  55.15   60.3    45.6    51.70
2010-02-03  51.80   54.1    50.5    51.95

如果您只想按年份和月份进行分组,请使用以下方法:

groupby

df3 = df_daily.groupby([df_daily.index.year,df_daily.index.month]).agg({'Open':'first',
                         'High':'max', 'Low': 'min', 'Close':'last'})

df3.index.names= ['Year', 'Month']
print(df3)

Output:

                Open    High    Low     Close
Year    Month               
2010      1     55.15   60.3    45.6    51.70
          2     51.80   54.1    50.5    51.95

如果您想要将“日期”以“YYYY-MM”的格式呈现,只需执行df2.reset_index()df2["Date"] = df2["Date"].dt.strftime("%Y-%m")即可。 - rpanai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接