【问题标题】:Create new QuarterEnd column in Python Pandas在 Python Pandas 中创建新的 QuarterEnd 列
【发布时间】:2018-01-23 03:31:17
【问题描述】:

我正在尝试使用日历年的季度结束日期创建一个新列(例如,如果今天是 8 月 4 日,则本季度的结束日期将是 9 月 30 日)。

我的 DataFrame 在名为 df['dates'] 的列中有一组日期。示例如下:

03/08/2017
26/02/2015
31/12/2012
16/04/2014
13/04/2016

这是我正在使用的代码,它不起作用:

df['q_date'] = pd.datetime(pd.tseries.offsets.QuarterEnd(startingMonth=(pd.to_datetime(df['date']).dt.month)))

我也尝试过循环,但没有成功。

非常感谢任何想法。谢谢。

【问题讨论】:

    标签: python pandas date dataframe


    【解决方案1】:

    您可以简单地添加pd.tseries.offsets.QuarterEnd(0):

    df['qdate'] = pd.to_datetime(df['date']) + pd.tseries.offsets.QuarterEnd(0)
    print (df)
             date      qdate
    0  03/08/2017 2017-03-31
    1  26/02/2015 2015-03-31
    2  31/12/2012 2012-12-31
    3  16/04/2014 2014-06-30
    4  13/04/2016 2016-06-30
    

    计时

    #5000 rows
    df = pd.concat([df]*1000).reset_index(drop=True)
    
    In [19]: %timeit df.assign(q_date=[pd.Period(d, freq='Q').end_time for d in df['date']])
    1 loop, best of 3: 1.84 s per loop
    
    In [20]: %timeit pd.to_datetime(df['date']) + pd.tseries.offsets.QuarterEnd(0)
    1 loop, best of 3: 913 ms per loop
    

    #50000 rows
    df = pd.concat([df]*10000).reset_index(drop=True)
    
    In [23]: %timeit df.assign(q_date=[pd.Period(d, freq='Q').end_time for d in df['date']])
    1 loop, best of 3: 18.5 s per loop
    
    In [24]: %timeit pd.to_datetime(df['date']) + pd.tseries.offsets.QuarterEnd(0)
    1 loop, best of 3: 9.13 s per loop
    

    【讨论】:

    • 您是否在两种方法之间运行过任何计时? Period 对象通常很慢,我很好奇这种方法是否更快。
    【解决方案2】:

    将每个日期转换为周期对象,然后获取它们的结束时间(即时间戳)。

    df = df.assign(q_date=[pd.Period(d, freq='Q').end_time for d in df['dates']])
    >>> df
            dates     q_date
    0  03/08/2017 2017-03-31
    1  26/02/2015 2015-03-31
    2  31/12/2012 2012-12-31
    3  16/04/2014 2014-06-30
    4  13/04/2016 2016-06-30
    

    【讨论】:

    • 您对如何在上一季度的最后一个日期执行此操作有任何想法吗?
    • 句号减一:df.assign(q_date=[(pd.Period(d, freq='Q') - 1).end_time for d in df['dates']])
    • 完美!谢谢老兄。
    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多