1

我从 Ken French 的数据库中使用 获取 Fama-French 因子pandas.io.data,但我不知道如何将整数年月日期索引(例如200105)转换为datetime索引,以便我可以利用更多pandas功能。

以下代码运行,但我在最后一个未注释行中的索引尝试删除了 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 回答
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]
于 2013-06-03T08:29:09.217 回答