2013-04-10 19 views
5

Próbuję przekonwertować indeks pandas.DataFrame z formatu napisów na indeks datetime, używając pandas.to_datetime().pandas.to_datetime niespójny format ciągu czasu

pandy importu:

In [1]: import pandas as pd 

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

Załóż przykładowy DataFrame:

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

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

Spójrz na indeksach. Zauważ, że format daty to dzień/miesiąc/rok:

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

Indeks Konwersja do 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 

Już na tym etapie widać, że format daty dla każdego wpisu została sformatowana inaczej . Pierwszy jest w porządku, drugi zamieniono miesiąc i dzień.

To jest to, co chcę napisać, ale unikając niespójne formatowanie łańcuchach daty:

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

Chyba pierwszy wpis jest prawidłowy, ponieważ funkcja „wie”, że nie ma 26 miesięcy, a więc nie wybiera domyślnego formatu miesiąca/dnia/roku.

Czy jest inny/lepszy sposób to zrobić? Czy mogę przekazać format do funkcji to_datetime()?

Dziękuję.

EDIT:

Znalazłem sposób to zrobić, bez 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 

ale to trochę niechlujny. Wszelkie poprawki mile widziane.

Odpowiedz

5

Istnieje (ukryte?) dayfirst argument 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 

W pand 0,11 (r) będzie można korzystać z format argument:

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

Dzięki @andy. Działa dziennik 'dayfirst'. Ale nie mogę użyć "formatu". 'TypeError: to_datetime() otrzymało nieoczekiwany argument słowa kluczowego" format ". Czy powinno to być dostępne w wersji pand, której używam (0.10.1)? –

+0

@ random.me ah Przepraszamy. Nie będzie, pracowałem w dev (więc będzie to 0.11)! –

+0

Dziękuję, że było to pomocne. Pracuję nad wersją 0.15, a pandy wciąż będą zdezorientowane, jeśli nie będę podawać parametru 'dayfirst = True', więc wprowadzenie' formatu' wyraźnie nie pomogło. – Rhubarb