2014-05-09 22 views
5

Bir alanı tarih olarak yorumlamaya çalışıyorum, tarihin görüntülendiği ayı temsil edecek tarihi değiştirin, tarihi bir ay ile dengeleyin ve sonra bir zaman damgası olmadan bir tarih olarak temsil edin. Ben çok hantal görünüyor ve hissediyor ki bu ile sona erdi adres:Pandalar ofset ve dönüştürme

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

zaman damgaları bu biçimde görürsün:

2012-09-01 00:00:00 

herhangi bir fikir daha iyi bir yol? Teşekkürler.

cevap

8

Eh, (Ben bunu biraz daha güzel yapar düşünüyorum) uygulamak ve onu vectorized do önleyebilirsiniz: Elbette

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 

, pandalar hep buna dönüştürür beri tarih hala datetime64[ns] olacaktır.

Düzenleme: yerine önceki ayın uzaklaştırmak önceki ayın sonuna istedi varsayalım:

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 

Düzenleme: Jeff daha pandonic yolu tarih bir hale getirmektir işaret DatetimeIndex ve bir Tarih Ofseti kullanın. Yani böyle bir şey:

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 

Veya ay sonları:

+0

Bu great.Much ') (uygulamak o kadar' datetime64 [M] 'kullanmak mümkün olup olmadığını biliyor musunuz' daha hızlıdır ayın sonu yerine başlangıcını bulmak? – JAB

+0

Evet, düzenlememe bakın. –

+1

daha pandonik bir yol bir dizin olarak ele almak ve uygun ofset ile geri alma kullanın burada görmek: http://pandas-docs.github.io/pandas-docs-travis/timeseries.html#dateoffset-objects – Jeff