【问题标题】:Resample daily data to get monthly dataframe?重新采样每日数据以获得每月数据框?
【发布时间】:2019-02-10 13:02:11
【问题描述】:

我有一个每日数据框,我试图通过 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()

这导致我假设的值是特定月份的开盘高低收盘值的平均值/平均值。

我希望从价格可用的月份的第一天开始获得该月的开盘价,高是该月的最高值,低是该月的最低值,接近实际收盘价。

我相信我可以使用 min max 以不同的方式在 pandas 中执行此操作,但只是想知道是否可以使用重采样来执行此操作。

预期的 df

         Open   High    Low   Close

Date                                         

2010-01-29  55.15  60.3  45.6  51.7

谢谢

【问题讨论】:

  • 你能发布你预期的输出df
  • @pyd,编辑了问题。

标签: python pandas


【解决方案1】:

resample by month 考虑月的最后一天,与列日期无关。

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

【讨论】:

  • 如果你想要Date 格式为YYYY-MM,你只需要df2.reset_index()df2["Date"] = df2["Date"].dt.strftime("%Y-%m")
猜你喜欢
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2023-03-19
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多