2016-05-20 14 views
16

Ho una serie all'interno di un DataFrame che ho letto inizialmente come oggetto, e quindi ho bisogno di convertirlo in una data nel formato yyyy-mm-dd dove dd è il fine del mese.Trova la fine del mese Pandas DataFrame Series

Per fare un esempio, ho dataframe df con una data colonna come un oggetto:

...  Date ... 
...  200104 ... 
...  200508 ... 

Quello che voglio quando questo è tutto detto e fatto è un oggetto data:

...  Date ... 
... 2001-04-30 ... 
... 2005-08-31 ... 

tale tale elemento df [ 'Data'].() restituisce

datetime.date(2001, 04, 30) 

ho usato il seguente codice per ottenere quasi arrivati, ma sono tutte le mie date all'inizio del mese, non alla fine. Si prega di avvisare.

df['Date'] = pd.to_datetime(df['Date'], format="%Y%m").dt.date 

Nota: Ho già importata Pandas annuncio pd, e datetime come dt

risposta

27

È possibile utilizzare pandas.tseries.offsets.MonthEnd:

from pandas.tseries.offsets import MonthEnd 

df['Date'] = pd.to_datetime(df['Date'], format="%Y%m") + MonthEnd(1) 

Il 1 in MonthEnd solo specifica per muovere un passo in avanti per la prossima data che è una fine del mese. (Usare 0 o lasciarlo vuoto funzionerebbe anche nel tuo caso). Se si desidera l'ultimo giorno del mese successivo, si utilizzerà MonthEnd(2), ecc. Questo dovrebbe funzionare per qualsiasi mese, quindi non è necessario conoscere il numero di giorni del mese o qualcosa del genere. Ulteriori informazioni sull'offset sono disponibili nello documentation.

utilizzo e uscita Esempio:

df = pd.DataFrame({'Date': [200104, 200508, 201002, 201602, 199912, 200611]}) 
df['EndOfMonth'] = pd.to_datetime(df['Date'], format="%Y%m") + MonthEnd(1) 

    Date EndOfMonth 
0 200104 2001-04-30 
1 200508 2005-08-31 
2 201002 2010-02-28 
3 201602 2016-02-29 
4 199912 1999-12-31 
5 200611 2006-11-30 
+0

Wow questo è impressionante, io vorrei sapere questo prima .... – user25064

+0

Questa è di gran lunga una delle soluzioni più eleganti che abbia mai visto, grazie! :) – Lisle

+0

Nessun problema! 'MonthEnd' è una delle gemme nascoste nei Panda che non penseresti immediatamente che i Panda avrebbero. Di solito il mio primo istinto è quello di usare altre librerie datetime ... fino a quando ricordo che Pandas ha una così bella funzionalità! – root

1

uso dateutil.relativedelta. Quindi aggiungi un delta relativo al primo del mese.

import dateutil.relativedelta as rd 

datetime.date(2001, 4, 1) + rd.relativedelta(day=31) 

si ottiene:

datetime.date(2001, 4, 30) 
7

convenuto che offre radice è il metodo destra. Tuttavia, i lettori che utilizzano ciecamente MonthEnd(1) sono in una sorpresa se usano l'ultima data del mese come input:

In [4]: pd.Timestamp('2014-01-01')+MonthEnd(1) 
Out[4]: Timestamp('2014-01-31 00:00:00') 

In [5]: pd.Timestamp('2014-01-31')+MonthEnd(1) 
Out[5]: Timestamp('2014-02-28 00:00:00') 

Utilizzando MonthEnd(0) dà invece questa:

In [7]: pd.Timestamp('2014-01-01')+MonthEnd(0) 
Out[7]: Timestamp('2014-01-31 00:00:00') 

In [8]: pd.Timestamp('2014-01-31')+MonthEnd(0) 
Out[8]: Timestamp('2014-01-31 00:00:00')