如何在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必须具有相同的长度”。有没有办法解决这个问题?