2013-04-10 17 views
5

私はpandas.to_datetime()を使用して、日時のインデックスに文字列形式からpandas.DataFrameのインデックスを変換しようとしています。pandas.to_datetime一貫性のない時間文字列の書式

インポートパンダ:

In [1]: import pandas as pd 

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

例のデータフレームを作成します。インデックスで

​​

ルック。日時に

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

変換インデックス:日付形式は日/月/年であることに注意してください

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 

すでにこの段階では、各エントリの日付形式が異なってフォーマットされていることがわかります。最初はうまく、2番目は月と日が交換されています。

これは私が書きたいものですが、日付文字列の一貫性のないフォーマットを回避:

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

私は機能はとても26ヶ月が存在しない「知っている」、およびので、最初のエントリが正しいことを推測しますデフォルトの月/日/年形式は選択されません。

はこれを行うには、別の/より良い方法はありますか?フォーマットを to_datetime()関数に渡すことはできますか?

ありがとうございます。

編集:私は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 

が、それは少し厄介です。あらゆる改善が歓迎されます。

答えて

5

to_datetimeからdayfirst引数(隠された?)があります。パンダ0.11で

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 

(以降)あなたは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

おかげ@andyが。 'dayfirst'引数が機能します。しかし、私は 'format'を使うことはできません。 'TypeError:to_datetime()に予期しないキーワード引数 'format'があります。それは私が使っているパンダのバージョン(0.10.1)で利用できるはずですか? –

+0

@ random.meああ申し訳ありません。そうではありません、私はdevで作業していたので(それは0.11になるでしょう)! –

+0

ありがとうございましたこれは役に立ちました。私は、バージョン0.15に取り組んでいると私はそうformat'は明らかに役立っていない ''導入dayfirst = true'をパラメータにフィードしていない場合パンダはまだ混乱します。それ@Zhubarb – Rhubarb

関連する問題