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)?
我希望我的输出如下所示
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)