2013-04-10 12 views
5

Sto tentando di convertire l'indice di uno pandas.DataFrame da un formato stringa a un indice datetime utilizzando pandas.to_datetime().pandas.to_datetime formato stringa orario incoerente

Importa i panda:

In [1]: import pandas as pd 

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

creare un esempio dataframe:

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

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

Guarda indici. Si noti che il formato della data è giorno/mese/anno:

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

indice Converti in datetime:

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 

Già in questa fase, si può vedere che il formato della data per ogni voce è stato formattato in modo diverso . Il primo va bene, il secondo ha scambiato mese e giorno.

Questo è quello che voglio scrivere, ma evitando la formattazione incoerente di stringhe di data:

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

Credo che la prima voce è corretta perché la funzione 'sa' che non ci sono 26 mesi, e così non sceglie il formato predefinito mese/giorno/anno.

C'è un altro/modo migliore per farlo? Posso passare il formato alla funzione to_datetime()?

Grazie.

EDIT:

ho trovato un modo per fare questo, senza pandas.to_datetime:

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 

ma è un po 'confuso. Qualsiasi miglioramento benvenuto.

risposta

5

ci sono (nascosto?) dayfirst argomento di to_datetime:

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 

In panda 0.11 (poi) sarete in grado di utilizzare l'argomento format:

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

Grazie @andy. L'argomento "dayfirst" funziona. Ma non posso usare 'format'. 'TypeError: to_datetime() ha ottenuto un argomento di parole chiave inaspettate 'format''. Dovrebbe essere disponibile nella versione panda che sto usando (0.10.1)? –

+0

@ random.me ah Scusa. Non lo sarà, stavo lavorando in dev (quindi sarà 0.11)! –

+0

Grazie, questo è stato utile. Sto lavorando alla versione 0.15 e i panda si confondono ancora se non inserisco il parametro 'dayfirst = True', quindi l'introduzione di' format' chiaramente non ha aiutato. – Rhubarb