2012-10-17 2 views
1

켄 프렌치의 데이터 라이브러리에서 pandas.io.data을 사용하여 Fama-French 요인을 얻었지 만 정수 년 월 데이터 인덱스를 변환하는 방법을 알 수는 없습니다. , 200105)를 datetime 색인에 추가하면 pandas 기능을 이용할 수 있습니다.팬더의 정수 인덱스에서 팬텀의 datetime 인덱스로 변환

다음 코드는 실행되지만 주석 처리되지 않은 마지막 줄의 내 인덱스 시도는 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

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 

이 종류의 느린, 그래서 당신은 많은 관측이 있다면 당신은 팬더의 최적화 사이 썬 기능을 사용할 수 있습니다

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 개의 항목이 있습니다.

+0

감사합니다! 내 '. 칼럼'을 사용하면 명백해야합니다. –

+0

하지만 정수 인덱스를 문자열로 변환 한 다음 날짜 파서를 사용하는 방법이 있습니까? 아니면 두 종점에서이 날짜 변환을 수행하는 래퍼를 작성해야합니까? –

+0

감사! "목록의 루프"는 목록에서'str()'을 사용하기 위해 누락 된 관용구입니다. 감사. –

2

이 지능형리스트를 시도, 나를 위해 작동합니다

ff = pd.DataFrame(DataReader("F-F_Research_Data_Factors", "famafrench")[0]) 
ff.columns = ['Mkt_rf', 'SMB', 'HML', 'rf']  
ff.index = [dt.datetime(d/100, d%100, 1) for d in ff.index] 
+1

일일 데이터는 어떻게 보이나요? 'ff.index = dt.datetime (d/100, d % 100, XYZ)에서 ff.index에서 d에 대해 'XYZ에 넣어야 할 것은 무엇입니까? –