Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重新采样每日数据以获得每月数据帧?_Python_Pandas - Fatal编程技术网

Python 重新采样每日数据以获得每月数据帧?

Python 重新采样每日数据以获得每月数据帧?,python,pandas,Python,Pandas,我有一个每天的数据帧,我正试图重新采样,以获得每月的开盘高低点收盘 我试过: df2 = df_daily.resample('M',convention='end').asfreq() 这给了我一个只有收盘值的数据框,即如果日期正好是月底,则为开盘价-高-低-收盘价的第30个值 这导致了我假设为特定月份的开盘价-高-低-收盘价的平均值 我希望从有价格的月份的第一天开始开盘,高是该月的最高值,低是该月的最低值,接近实际收盘 我相信我可以用min-max以不同的方式在熊猫身上做到这一点,但我只是

我有一个每天的数据帧,我正试图重新采样,以获得每月的开盘高低点收盘

我试过:

df2 = df_daily.resample('M',convention='end').asfreq()
这给了我一个只有收盘值的数据框,即如果日期正好是月底,则为开盘价-高-低-收盘价的第30个值

这导致了我假设为特定月份的开盘价-高-低-收盘价的平均值

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

我相信我可以用min-max以不同的方式在熊猫身上做到这一点,但我只是想知道是否可以使用重采样来做到这一点

预期df

         Open   High    Low   Close

Date                                         

2010-01-29  55.15  60.3  45.6  51.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
如果您只想按年份和月份分组,请使用:

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

你能发布你的预期输出吗df@pyd,编辑了问题。如果希望日期的格式为YYYY-MM,则只需执行df2.reset_index和df2[Date]=df2[Date].dt.strftime%Y-%m即可。
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
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