2014-05-24 16 views
9

Ho una colonna di data e ora che devono essere convertiti in periodo ("Mese"). per esempio.Convertire una colonna di data e ora in periodi in panda

1985-12-31 00:00:00 to 1985-12 

I panda hanno una funzione .to_period, ma funziona solo per l'indice di data e ora, non per la colonna. Quindi puoi avere solo un indice periodico, ma non una colonna periodo?

E funziona solo se il timestamp è l'unico indice. Cioè, se i timestamp fanno parte di un multIndex, la funzione .to_period() non funziona altrettanto bene.

Sembra che i panda presumano che le persone utilizzeranno sempre timestamp e periodi come indice, ma non una singola colonna, che apparentemente non è il caso.

Ad ogni modo posso andare in giro con questo? O se non in Pandas, può essere fatto in numpy?

Grazie!

risposta

17

mi sono imbattuto in questa discussione di oggi, e dopo ulteriori scavo hanno trovato che i panda .15 permette un più facile utilizzo un'opzione .dt, si può evitare la fase di creazione di un indice e crea la colonna direttamente. È possibile utilizzare quanto segue per ottenere lo stesso risultato:

df[1] = df[0].dt.to_period('M') 
+0

Grazie, bel post! – user3576212

+0

Questo non funziona: l'oggetto 'DatetimeProperties' non ha attributo 'to_priod' –

7

Hai ragione, è necessario eseguire questo oggetto DatetimeIndex anziché solo colonne di data/ora. Tuttavia, questo è abbastanza facile - basta avvolgerlo in un costruttore DatetimeIndex:

In [11]: df = pd.DataFrame(pd.date_range('2014-01-01', freq='2w', periods=12)) 

In [12]: df 
Out[12]: 
      0 
0 2014-01-05 
1 2014-01-19 
2 2014-02-02 
3 2014-02-16 
4 2014-03-02 
5 2014-03-16 
6 2014-03-30 
7 2014-04-13 
8 2014-04-27 
9 2014-05-11 
10 2014-05-25 
11 2014-06-08 

In [13]: pd.DatetimeIndex(df[0]).to_period('M') 
Out[13]: 
<class 'pandas.tseries.period.PeriodIndex'> 
freq: M 
[2014-01, ..., 2014-06] 
length: 12 

Questa è una PeriodIndex, ma si può fare una colonna:

In [14]: df[1] = pd.DatetimeIndex(df[0]).to_period('M') 

In [15]: df 
Out[15]: 
      0  1 
0 2014-01-05 2014-01 
1 2014-01-19 2014-01 
2 2014-02-02 2014-02 
3 2014-02-16 2014-02 
4 2014-03-02 2014-03 
5 2014-03-16 2014-03 
6 2014-03-30 2014-03 
7 2014-04-13 2014-04 
8 2014-04-27 2014-04 
9 2014-05-11 2014-05 
10 2014-05-25 2014-05 
11 2014-06-08 2014-06 

si può fare un simile trucco se i timestamp fanno parte di un MultiIndex estraendo quella "colonna" e passandola a DatetimeIndex come sopra , ad esempio utilizzando df.index.get_level_values:
Ad esempio:

df[2] = 2 
df.set_index([0, 1], inplace=True) 
df.index.get_level_values(0) # returns a DatetimeIndex 
+0

Potrebbe fornire un esempio di livello di estrazione = 1 indice da multiIndex come colonna? – user3576212

+0

http://pandas.pydata.org/pandas-docs/stable/indexing.html#reconstructing-the-level-labels cioè 'df.index.get_level_values ​​(1)', sembra che questo restituisca un DatetimeIndex se questo è date. –

+0

iirc questo dovrebbe funzionare in master/0.14.0 e rimanere in un periodo – Jeff

Problemi correlati