2013-04-10 17 views
5

Ben pandas.to_datetime() kullanarak bir datetime endeksine dize biçiminden bir pandas.DataFrame dizinini dönüştürmek için çalışıyorum.pandas.to_datetime tutarsız zaman dize biçimi

İthalat pandalar:

In [1]: import pandas as pd 

In [2]: pd.__version__ 
Out[2]: '0.10.1' 

bir örnek DataFrame oluşturun: endeksleri de

In [3]: d = {'data' : pd.Series([1.,2.], index=['26/12/2012', '10/01/2013'])} 

In [4]: df=pd.DataFrame(d) 

bak.

In [5]: df.index 
Out[5]: Index([26/12/2012, 10/01/2013], dtype=object) 

dönüştürme indeks datetime: tarih formatı gün/ay/yıl olduğunu Not bu aşamada Zaten

In [6]: pd.to_datetime(df.index) 
Out[6]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2012-12-26 00:00:00, 2013-10-01 00:00:00] 
Length: 2, Freq: None, Timezone: None 

, her giriş için tarih biçimini farklı biçimlendirilmiş edildiğini görebilirsiniz . Birincisi para cezası, ikincisi ay ve gün değiştirildi.

In [7]: df.set_index(pd.to_datetime(df.index)) 
Out[7]: 
data 
2012-12-26 1 
2013-10-01 2 

Ben işlevi 26 ay bulunmamaktadır 'bilir', çünkü ilk giriş doğru olduğunu tahmin ve böylece:

Bu

ben yazmak istiyorum, ama tarih dizeleri tutarsız biçimlendirme kaçınarak ne varsayılan ay/gün/yıl formatını seçmez.

bunu yapmanın başka/daha iyi bir yolu var mı? Biçimi to_datetime() işlevine iletebilir miyim?

Teşekkür ederiz.

DÜZENLEME: pandas.to_datetime olmadan, bunu yapmanın bir yolunu bulmuşlardır

:

import datetime.datetime as dt 
date_string_list = df.index.tolist() 
datetime_list = [ dt.strptime(date_string_list[x], '%d/%m/%Y') for x in range(len(date_string_list)) ] 
df.index=datetime_list 

ama biraz dağınık. Herhangi bir gelişme hoş geldiniz.

cevap

5

vardır (gizli?) dayfirst argüman to_datetime için:

In [23]: pd.to_datetime(df.index, dayfirst=True) 
Out[23]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2012-12-26 00:00:00, 2013-01-10 00:00:00] 
Length: 2, Freq: None, Timezone: None 

pandalar 0.11 (sonrası) Eğer format argüman kullanmak mümkün olacak ise: @andy

In [24]: pd.to_datetime(df.index, format='%d/%m/%Y') 
Out[24]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2012-12-26 00:00:00, 2013-01-10 00:00:00] 
Length: 2, Freq: None, Timezone: None 
+0

teşekkür ederiz. 'Dayfirst' arg çalışır. Ama formatı kullanamıyorum. TypeError: to_datetime() beklenmedik bir anahtar kelime argümanı 'formatı' aldı. Kullanmakta olduğum panda versiyonunda mevcut mu (0.10.1)? –

+0

@ random.me ah Üzgünüz. Olmayacak, ben dev çalışıyordum (bu yüzden 0.11 olacak)! –

+0

Teşekkür ederim bu yardımcı oldu. Ben sürümü 0.15 üzerinde çalışıyorum ve bu yüzden 'açıkça yardım etmedi format' sokulmasıyla' dayfirst = TRUE parametresinde beslemek yoksa pandalar hala yaşıyor. – Rhubarb