如何计算pandas中的自定义会计年度?

SSM*_*SMK 2 python datetime numpy dataframe pandas

我有一个如下所示的数据框

app_date
20/3/2017
28/8/2017
18/10/2017
15/2/2017
2/5/2017
11/9/2016

df = pd.read_clipboard()
Run Code Online (Sandbox Code Playgroud)

我们公司的会计年度是从October当年到September明年

Q1 - Oct to Dec
Q2 - Jan to Mar
Q3 - Apr to Jun
Q4 - July - Sep  
Run Code Online (Sandbox Code Playgroud)

我正在尝试类似下面的东西

tf['app_date'] = pd.to_datetime(tf['app_date'])
tf['act_month'] = pd.DatetimeIndex(tf['app_date']).month
tf['act_year'] = pd.DatetimeIndex(tf['app_date']).year
tf['act_qtr'] = tf['app_date'].dt.to_period('Q').dt.strftime('Q%q')
tf['comp_fis_year'] = np.where(tf['act_month'] >= 9,tf['act_year']+1,tf['act_year'])
tf['comp_fis_qtr'] = tf['app_date'].dt.to_period('Q').add(1).dt.strftime('Q%q') #thanks to jezrael for this trick to get quarter
Run Code Online (Sandbox Code Playgroud)

有没有优雅且有效的方法来完成上述操作?主要是根据我们的财政年度来计算财政年度(Oct to Sep)

我希望我的输出如下所示

在此输入图像描述

moz*_*way 5

IIUC,使用to_period定义频率

pd.to_datetime(df['app_date'], dayfirst=True).dt.to_period('Q-SEP')
Run Code Online (Sandbox Code Playgroud)

输出:

0    2017Q2
1    2017Q4
2    2018Q1
3    2017Q2
4    2017Q3
5    2016Q4
Name: app_date, dtype: period[Q-SEP]
Run Code Online (Sandbox Code Playgroud)

对于单独的列:

s = pd.to_datetime(df['app_date'], dayfirst=True).dt.to_period('Q-SEP')
s.astype(str).str.extract('(?P<year>\d+)(?P<quarter>Q\d+)')
Run Code Online (Sandbox Code Playgroud)

输出:

   year quarter
0  2017      Q2
1  2017      Q4
2  2018      Q1
3  2017      Q2
4  2017      Q3
5  2016      Q4
Run Code Online (Sandbox Code Playgroud)

问开始/结束:

df['Q'] = pd.to_datetime(df['app_date'], dayfirst=True).dt.to_period('Q-SEP')
df['Qstart'] = df['Q'].dt.asfreq('D', 's')
df['Qend'] = df['Q'].dt.asfreq('D', 'e')
Run Code Online (Sandbox Code Playgroud)

输出:

     app_date       Q      Qstart        Qend
0   20/3/2017  2017Q2  2017-01-01  2017-03-31
1   28/8/2017  2017Q4  2017-07-01  2017-09-30
2  18/10/2017  2018Q1  2017-10-01  2017-12-31
3   15/2/2017  2017Q2  2017-01-01  2017-03-31
4    2/5/2017  2017Q3  2017-04-01  2017-06-30
5   11/9/2016  2016Q4  2016-07-01  2016-09-30
Run Code Online (Sandbox Code Playgroud)