在 Python Pandas 中创建新的 QuarterEnd 列

mat*_*ack 3 python date dataframe pandas

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

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

03/08/2017
26/02/2015
31/12/2012
16/04/2014
13/04/2016
Run Code Online (Sandbox Code Playgroud)

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

df['q_date'] = pd.datetime(pd.tseries.offsets.QuarterEnd(startingMonth=(pd.to_datetime(df['date']).dt.month)))
Run Code Online (Sandbox Code Playgroud)

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

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

jez*_*ael 5

您可以简单地添加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
Run Code Online (Sandbox Code Playgroud)

时间

#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
Run Code Online (Sandbox Code Playgroud)
#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
Run Code Online (Sandbox Code Playgroud)