2013-12-09 3 views
15

Ho bisogno di aggiungere 1 giorno per ogni data in cui voglio ottenere la data di inizio del mese successivo, ad esempio 2014-01-2014 per il primo elemento nel dataframe. provato:I panda aggiungono un giorno alla colonna

montdist['date'] + pd.DateOffset(1) 

che mi dà:

TypeError: cannot use a non-absolute DateOffset in datetime/timedelta operations [<DateOffset>] 

Avere un dataframe:

Units mondist    date 
1 6491 0.057785 2013-12-31 00:00:00 
2 7377 0.065672 2014-01-31 00:00:00 
3 9990 0.088934 2014-02-28 00:00:00 
4 10362 0.092245 2014-03-31 00:00:00 
5 11271 0.100337 2014-04-30 00:00:00 
6 11637 0.103596 2014-05-31 00:00:00 
7 10199 0.090794 2014-06-30 00:00:00 
8 10486 0.093349 2014-07-31 00:00:00 
9 9282 0.082631 2014-08-31 00:00:00 
10 8632 0.076844 2014-09-30 00:00:00 
11 8204 0.073034 2013-10-31 00:00:00 
12 8400 0.074779 2013-11-30 00:00:00 

risposta

22

Ne fanno un DatetimeIndex prima:

pd.DatetimeIndex(montdist['date']) + pd.DateOffset(1) 

Nota: I ° inchiostro v'è una richiesta di funzionalità che questo potrebbe lavorare con colonne di data ...

In azione:

In [11]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B']) 

In [12]: df['date'] = pd.to_datetime(['21-11-2013', '22-11-2013']) 

In [13]: pd.DatetimeIndex(df.date) + pd.DateOffset(1) 
Out[13]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2013-11-22 00:00:00, 2013-11-23 00:00:00] 
Length: 2, Freq: None, Timezone: None 

In [14]: pd.DatetimeIndex(df.date) + pd.offsets.Hour(1) 
Out[14]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2013-11-21 01:00:00, 2013-11-22 01:00:00] 
Length: 2, Freq: None, Timezone: Non 
+0

Yup, è strano che non funzionerà a meno che non si tratta di un indice .... – dartdog

+1

@dartdog DatetimeIndex è ha diversi metodi specifici di data con cui giocare, ma una colonna doesn' t (ancora). –

+0

vedi sotto soluzione per come fare questo su una colonna non indicizzata ... – dartdog

10

Provare a usare timedelta():

mondist['shifted_date']=mondist.date + datetime.timedelta(days=1) 
+0

Bello .. anche se la soluzione di @Ady Hayden funziona bene per me in questo caso. È bene sapere che puoi manipolare direttamente le date in una colonna non indicizzata. – dartdog

+0

Questo ha funzionato meglio per me. –

3

Per quanto posso dire tshift è un po 'più veloce di fare matematica come + pd.DateOffset ecc. Naturalmente si applica solo agli indici serie o Dataframe, non alle colonne .. ma si potrebbe fare:

df['newdate'] = pd.Series(index=df.index).tshift(periods=1, freq='D').index 

Se il tuo df è grande, questo può radersi metà del tempo - almeno lo ha fatto per me, ed è per questo che lo sto usando.

3

Non c'è bisogno di trasformarsi in un indice. Usando solo .apply() opere:

df['newdate'] = pd.to_datetime(df['date']).apply(pd.DateOffset(1)) 
+0

Sembra che la funzione sia stata aggiunta per colonne vs indici .., grazie per l'aggiornamento! – dartdog