7

pandas.DataFrameを使用して、文字列形式のインデックスを日時インデックスに変換しようとしていpandas.to_datetime()ます。

パンダのインポート:

In [1]: import pandas as pd

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

サンプルの DataFrame を作成します。

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

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

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

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

この段階ですでに、各エントリの日付形式が異なる形式になっていることがわかります。1 つ目は問題なく、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

しかし、それは少し面倒です。改善を歓迎します。

4

1 に答える 1

5

への(隠された?)dayfirst引数があります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

formatpandas 0.11 (以降) では、次の引数を使用できます。

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
于 2013-04-10T22:50:08.567 に答える