【问题标题】:How to find the last day of each quarter in a given date period in Python?如何在Python中找到给定日期期间每个季度的最后一天?
【发布时间】:2020-11-12 01:07:04
【问题描述】:

现在我有一个这样的数据框: (代码和日期是索引)

Ticker  Date        Open    Low High    Close   Adj. Close  Shares Outstanding                              
A       2007-01-25  34.99   34.05      35.48    34.30       NaN
        2007-01-26  34.30   33.46      34.60    34.41       NaN
        ....
        2007-06-27  34.30   34.00      34.40    34.09       NaN
        2007-06-28  33.98   33.68      34.08    33.97       NaN
        2007-07-01  34.08   33.63      34.32    34.01       NaN
B       2007-01-12  34.99   34.05      35.48    34.30       NaN
        ...
        2007-08-27  34.30   33.46      34.60    34.41       NaN
        2007-08-28  34.30   34.00      34.40    34.09       NaN
        2007-09-01  33.98   33.68      34.08    33.97       NaN
        2007-09-02  34.08   33.63      34.32    34.01       NaN
C       2007-03-28  34.99   34.05      35.48    34.30       NaN
        2007-03-29  34.30   33.46      34.60    34.41       NaN
        2007-04-01  34.30   34.00      34.40    34.09       NaN
        2007-04-02  33.98   33.68      34.08    33.97       NaN
        2007-04-03  34.08   33.63      34.32    34.01       NaN

对于每个股票,多年来每天都有股票价格。但是,我只想要每家公司的季度末价格,并获得所有公司季度末价格的数据框。我还想将所有公司的每个季度分成不同的数据框。

例如:

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。有没有办法可以找到每个季度给定日期范围的最后一天?

【问题讨论】:

    标签: python pandas date datetime


    【解决方案1】:

    您只需要一个简单的 GroupBy:

    quarter = pd.PeriodIndex(df['Date'], freq='Q', name='Quarter')
    result = df.groupby(['Ticker', quarter]).last()
    

    要获取特定季度的数据:

    result.loc[('A', '2019Q1')]
    

    【讨论】:

    • 嗨!感谢您的回答,但是,当我使用代码时,我收到错误“Grouper and axis must be the same length”。有什么办法可以解决吗?
    【解决方案2】:

    我将首先通过groupbylast 计算每个季度每个股票代码的最后一行到一个临时数据帧中,然后从中提取每个季度的各个数据帧:

    tmp = df.groupby(['Ticker', pd.PeriodIndex(df['Date'], freq='Q',   name='Quarter')]
    

    ).last().reset_index(level=0)

    individual_df = {str(i): df.reset_index(drop=True) for i, df in tmp.groupby(['Quarter'])}
    

    使用您的示例数据,它给出:

    >>> 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 and axis must be the same length”。有什么办法可以解决吗?
    • @KristineLian:你的数据框的索引是什么?
    • 我的索引是'Ticker'和'Date'
    • 哦,我是在重置原始数据帧的索引后才知道的。非常感谢!
    • @KristineLian:我正要为此发表新评论。很高兴你自己找到了它:-)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    相关资源
    最近更新 更多