我正在尝试使用日历年的季度结束日期创建一个新列(例如,如果今天是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)))
我也试过循环,但都没有成功。
任何想法都非常感谢。感谢。
答案 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