如何在Python中查找给定日期周期内每个季度的最后一天?
现在我有了这样一个数据帧: (股票代码和日期为索引) 对于每一种股票,都有多年来每天的股价。但是,我只需要每个公司的季度末价格,并获得所有公司的季度末价格的数据框架。我还想将所有公司的每个季度划分为不同的数据框架 例如:如何在Python中查找给定日期周期内每个季度的最后一天?,python,pandas,date,datetime,Python,Pandas,Date,Datetime,现在我有了这样一个数据帧: (股票代码和日期为索引) 对于每一种股票,都有多年来每天的股价。但是,我只需要每个公司的季度末价格,并获得所有公司的季度末价格的数据框架。我还想将所有公司的每个季度划分为不同的数据框架 例如: Ticker Date Open Low High Close Adj. Close Shares Outstanding A 2007-06-30 34.99 34
Ticker Date Open Low High Close Adj. Close Shares Outstanding
A 2007-06-30 34.99 34.05 35.48 34.30 NaN
B 2007-06-30 34.30 33.46 34.60 34.41 NaN
....
c 2007-06-30 34.30 34.00 34.40 34.09 NaN
问题是,由于周末股市不会开盘。因此,每个股票代码的季度末可能不是日历季度末。例如,第二季度结束于6月30日,但股票季度结束于6月29日。有没有办法找到每个季度给定日期范围的最后一天?您只需要一个简单的分组:
quarter = pd.PeriodIndex(df['Date'], freq='Q', name='Quarter')
result = df.groupby(['Ticker', quarter]).last()
要获取特定季度的数据,请执行以下操作:
result.loc[('A', '2019Q1')]
您只需要一个简单的GroupBy:
quarter = pd.PeriodIndex(df['Date'], freq='Q', name='Quarter')
result = df.groupby(['Ticker', quarter]).last()
要获取特定季度的数据,请执行以下操作:
result.loc[('A', '2019Q1')]
我将首先通过
groupby
和last
计算每个季度每个股票代码的最后一行,并将其放入一个临时数据帧中,然后从中提取每个季度的单个数据帧:
tmp = df.groupby(['Ticker', pd.PeriodIndex(df['Date'], freq='Q', name='Quarter')]
).last().reset_索引(级别=0)
根据您的示例数据,它给出:
>>> pprint.pprint(individual_df)
{'2007Q1': Ticker Date Open Low High Close Adj. Close Shares Outstanding
0 A 2007-01-26 34.30 33.46 34.60 34.41 NaN
1 B 2007-01-12 34.99 34.05 35.48 34.30 NaN
2 C 2007-03-29 34.30 33.46 34.60 34.41 NaN,
'2007Q2': Ticker Date Open Low High Close Adj. Close Shares Outstanding
0 A 2007-06-28 33.98 33.68 34.08 33.97 NaN
1 C 2007-04-03 34.08 33.63 34.32 34.01 NaN,
'2007Q3': Ticker Date Open Low High Close Adj. Close Shares Outstanding
0 A 2007-07-01 34.08 33.63 34.32 34.01 NaN
1 B 2007-09-02 34.08 33.63 34.32 34.01 NaN}
我将首先通过
groupby
和last
计算每个季度每个股票代码的最后一行,并将其放入一个临时数据帧中,然后从中提取每个季度的单个数据帧:
tmp = df.groupby(['Ticker', pd.PeriodIndex(df['Date'], freq='Q', name='Quarter')]
).last().reset_索引(级别=0)
根据您的示例数据,它给出:
>>> pprint.pprint(individual_df)
{'2007Q1': Ticker Date Open Low High Close Adj. Close Shares Outstanding
0 A 2007-01-26 34.30 33.46 34.60 34.41 NaN
1 B 2007-01-12 34.99 34.05 35.48 34.30 NaN
2 C 2007-03-29 34.30 33.46 34.60 34.41 NaN,
'2007Q2': Ticker Date Open Low High Close Adj. Close Shares Outstanding
0 A 2007-06-28 33.98 33.68 34.08 33.97 NaN
1 C 2007-04-03 34.08 33.63 34.32 34.01 NaN,
'2007Q3': Ticker Date Open Low High Close Adj. Close Shares Outstanding
0 A 2007-07-01 34.08 33.63 34.32 34.01 NaN
1 B 2007-09-02 34.08 33.63 34.32 34.01 NaN}
你好感谢您的回答,但是,当我使用代码时,我收到错误“Grouper和axis必须具有相同的长度”。有什么方法可以修复它吗?@KristineLian:你的数据框上的索引是什么?我的索引都是'Ticker'和'Date'。哦,我在为原始数据框重置索引后得到了它。多谢各位@克莉丝汀尼莲:我正要为此发表新的评论。很高兴你自己找到了:-)。嗨!感谢您的回答,但是,当我使用代码时,我收到错误“Grouper和axis必须具有相同的长度”。有什么方法可以修复它吗?@KristineLian:你的数据框上的索引是什么?我的索引都是'Ticker'和'Date'。哦,我在为原始数据框重置索引后得到了它。多谢各位@克莉丝汀尼莲:我正要为此发表新的评论。很高兴你自己找到了:-)。嗨!感谢您的回答,但是,当我使用代码时,我收到错误“Grouper和axis必须具有相同的长度”。有什么办法解决它吗?嗨!感谢您的回答,但是,当我使用代码时,我收到错误“Grouper和axis必须具有相同的长度”。有没有办法解决这个问题?