1

を使用して Ken French のデータ ライブラリから Fama-French 係数を取得しますが、より多くの機能を利用できるようにpandas.io.data、整数の年月日インデックス (たとえば、200105) をインデックスに変換する方法がわかりません。datetimepandas

次のコードは実行されますが、コメントされていない最後の行でインデックスを試行すると、 DataFrame 内のすべてのデータが削除されますff。も試し.reindex()ましたが、これはインデックスを に変更しませんrange。方法は何pandasですか?ありがとう!

import pandas as pd
from pandas.io.data import DataReader
import datetime as dt

ff = pd.DataFrame(DataReader("F-F_Research_Data_Factors", "famafrench")[0])
ff.columns = ['Mkt_rf', 'SMB', 'HML', 'rf']

start = ff.index[0]
start = dt.datetime(year=start//100, month=start%100, day=1)
end = ff.index[-1]
end = dt.datetime(year=end//100, month=end%100, day=1)
range = pd.DateRange(start, end, offset=pd.datetools.MonthEnd())
ff = pd.DataFrame(ff, index=range)
#ff.reindex(range)
4

2 に答える 2

4

reindexインデックスを変更するのではなく、既存のインデックスを指定されたインデックスに再配置します。ff.index = range長さと配置が一致していることを確認した場合にのみ実行できます。

元の各インデックス値を解析する方がはるかに安全です。簡単な方法は、文字列に変換してこれを行うことです。

In [132]: ints
Out[132]: Int64Index([201201, 201201, 201201, ..., 203905, 203905, 203905])

In [133]: conv = lambda x: datetime.strptime(str(x), '%Y%m')

In [134]: dates = [conv(x) for x in ints]

In [135]: %timeit [conv(x) for x in ints]
1 loops, best of 3: 222 ms per loop

これはちょっと遅いので、観察が多い場合は、pandas で cython の最適化関数を使用することをお勧めします。

In [144]: years = (ints // 100).astype(object)

In [145]: months = (ints % 100).astype(object)

In [146]: days = np.ones(len(years), dtype=object)

In [147]: import pandas.lib as lib

In [148]: %timeit Index(lib.try_parse_year_month_day(years, months, days))
100 loops, best of 3: 5.47 ms per loop

ここintsには10000のエントリがあります。

于 2012-10-17T05:48:07.940 に答える