2016-08-04 53 views
2

我有一個pd.DataFrame,看起來像這樣:季度出datetime64

In [119]: df1 
Out[119]: 
     DATES 
0 2014-01-01 
1 2014-01-24 
2 2014-03-11 
3 2014-04-09 
4 2014-04-21 
5 2014-05-02 
6 2014-05-13 
7 2014-06-11 
8 2014-06-21 
9 2014-07-22 
10 2014-08-04 

In [120]: df1.dtypes 
Out[120]: 
DATES datetime64[ns] 
dtype: object 

,我要計算的條目中的每一個屬於四分之一。什麼到目前爲止,我已經試過是:

df1['QUARTER'] = df1['DATES'].map(lambda x: '2014Q1' if (x.year == 2014 & (x.month == 1 | x.month == 2 | x.month == 3)) else np.nan) 

,然後我得到:

In [124]: df1 
Out[124]: 
     DATES QUARTER 
0 2014-01-01  NaN 
1 2014-01-24  NaN 
2 2014-03-11  NaN 
3 2014-04-09  NaN 
4 2014-04-21  NaN 
5 2014-05-02  NaN 
6 2014-05-13  NaN 
7 2014-06-11  NaN 
8 2014-06-21  NaN 
9 2014-07-22  NaN 
10 2014-08-04  NaN 

最後,我已經試過:

df1['QUARTER'] = df1['DATES'].map(lambda x: x.year + '-Q' + x.quarter)

,然後我得到一個錯誤:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

任何想法表示讚賞,謝謝!

回答

3
In [30]: df['QUARTER'] = pd.PeriodIndex(df['DATES'], freq='Q') 

In [31]: df 
Out[31]: 
     DATES QUARTER 
0 2014-01-01 2014Q1 
1 2014-01-24 2014Q1 
2 2014-03-11 2014Q1 
3 2014-04-09 2014Q2 
4 2014-04-21 2014Q2 
5 2014-05-02 2014Q2 
6 2014-05-13 2014Q2 
7 2014-06-11 2014Q2 
8 2014-06-21 2014Q2 
9 2014-07-22 2014Q3 
10 2014-08-04 2014Q3 

df['QUARTER']的值是Periods。如果您想串,然後用

df['QUARTER'] = pd.PeriodIndex(df['DATES'], freq='Q').format() 

順便說一句,還可以通過添加字符串和字符串值的系列,以構建理想的結果:

In [59]: df['DATES'].dt.year.astype(str) + 'Q' + df['DATES'].dt.quarter.astype(str) 
Out[59]: 
0  2014Q1 
1  2014Q1 
2  2014Q1 
3  2014Q2 
4  2014Q2 
5  2014Q2 
6  2014Q2 
7  2014Q2 
8  2014Q2 
9  2014Q3 
10 2014Q3 
Name: DATES, dtype: object 

可能在將來對你有用,但在這種情況下,你不需要弄髒手。

+0

正是我在找的,謝謝! – Thanos

1

你可以做使用dt訪問:

df1['QUARTER'] = df1['DATES'].dt.quarter