2016-08-04 6 views
2

Ich habe ein pd.DataFrame die wie folgt aussieht:Viertel von 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 

und ich möchte das Quartal berechnen jeweils einer der Einträge gehört. Was ich bisher versucht ist:

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

und dann bekomme ich:

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 

Schließlich habe ich versucht:

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

und dann bekomme ich einen Fehler :

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

Irgendwelche Ideen werden geschätzt, danke!

Antwort

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 

Die Werte in df['QUARTER'] sind Periods. Wenn Sie Strings möchten, dann verwenden Sie

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

By the way, ist es auch möglich, das gewünschte Ergebnis zu bauen von Strings und String-wertige Serie ergänzt:

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 

Das könnte Ihnen in Zukunft nützlich sein, aber in diesem Fall brauchen Sie sich nicht die Hände schmutzig zu machen.

+0

Genau das, was ich gesucht habe, danke! – Thanos

1

können Sie tun dt Accessor mit:

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