在Python Pandas中创建新的QuarterEnd列

时间:2017-08-15 08:18:18

标签: python pandas date dataframe

我正在尝试使用日历年的季度结束日期创建一个新列(例如,如果今天是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)))

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

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

2 个答案:

答案 0 :(得分:3)

您只需添加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

<强> Timeings

#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

答案 1 :(得分: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