2014-05-09 17 views
5

Sto cercando di interpretare un campo come una data, modificare la data per rappresentare il mese in cui appare la data, sfalsare la data di un mese e quindi rappresentarla come data senza data e ora. Ho finito con questo, che guarda e si sente troppo ingombrante:Sfasamento data e conversione panda

df['DATE'].apply(lambda d: pd.to_datetime(pd.to_datetime(d).to_period('M').to_timestamp('M')\ 
             - np.timedelta64(1,'M')).date()) 

I timestamp sono stringhe in questo formato:

2012-09-01 00:00:00 

Tutte le idee per un modo migliore? Grazie.

risposta

8

Beh, è ​​possibile evitare le applicano e farlo Vettorializzare (credo che lo rende un po 'più bello):

print df 

        date x1 
0 2010-01-01 00:00:00 10 
1 2010-02-01 00:00:00 10 
2 2010-03-01 00:00:00 10 
3 2010-04-01 00:00:00 10 
4 2010-04-01 00:00:00 5 
5 2010-05-01 00:00:00 5 

df['date'] = (pd.to_datetime(df['date']).values.astype('datetime64[M]') 
       - np.timedelta64(1,'M')) 
print df 

     date x1 
0 2009-12-01 10 
1 2010-01-01 10 
2 2010-02-01 10 
3 2010-03-01 10 
4 2010-03-01 5 
5 2010-04-01 5 

Naturalmente, le date saranno ancora datetime64[ns] dal panda converte sempre a quello.

Edit: Supponiamo che si voleva alla fine del mese precedente, invece di beggining del mese precedente:

df['date'] = (pd.to_datetime(df['date']).values.astype('datetime64[M]') 
       - np.timedelta64(1,'D')) 
print df 

     date x1 
0 2009-11-30 10 
1 2009-12-31 10 
2 2010-01-31 10 
3 2010-02-28 10 
4 2010-02-28 5 
5 2010-03-31 5 

Edit: Jeff sottolinea che un modo più pandonic è quello di rendere la data di DatetimeIndex e utilizzare un offset data. Quindi, qualcosa di simile a:

df['date'] = pd.Index(df['date']).to_datetime() - pd.offsets.MonthBegin(1) 
print df 

     date x1 
0 2009-12-01 10 
1 2010-01-01 10 
2 2010-02-01 10 
3 2010-03-01 10 
4 2010-03-01 5 
5 2010-04-01 5 

o mese-end:

+0

Questo è great.Much più veloce di 'applicare()' Sapete se è possibile usare 'datetime64 [M]' a trovare la fine del mese anziché l'inizio? – JAB

+0

Sì, vedere la mia modifica. –

+1

un modo più pandonico è quello di trattare come un indice e utilizzare il rollback con l'offset appropriato vedere qui: http://pandas-docs.github.io/pandas-docs-travis/timeseries.html#dateoffset-objects – Jeff

Problemi correlati