我的CSV数据文件包含以下格式的日期:
data["DayIndex"] = pandas.DatetimeIndex(data["Day"])
我想把它变成一个合适的熊猫时间序列。我试过这个:
即使是几十万行,也需要很长时间。我有什么选择来加速解析?
答案 0 :(得分:3)
data['DayIndex'] = pandas.to_datetime(data['Day'])
合并@ ayhan的评论
data['DayIndex'] = pandas.to_datetime(data['Day'], format='%m/%d/%Y')
或者从csv导入时,请添加parse_dates
data = read_csv(..., parse_dates=['Day'],
date_parser=lambda s: pandas.datetime.strptime(s, '%m/%d/%y'))
不确定这是否会被纳入最新版本的熊猫......我不这么认为,至少我没有在“什么是新的”部分看到它...
无论如何,我们可以构建一个自定义解析器来重用旧的解析,而不是重新分析我们已经看过的相同日期。
让我们使用map
和一些聪明的哈希。
# let u be unique date stings. We'll do this so that we only parse them once.
u = pd.unique(data['Day'])
# then build a dictionary of these
m = dict(zip(u, pd.to_datetime(u, format='%m/%d/%Y')))
# then use `map` to build the new column
data['DayIndex'] = data['Day'].map(m)
<强>时序强>
a = np.random.choice(
['04/23/17', '04/20/17', '04/21/17', '04/24/17', '04/22/17',
'05/02/17', '04/27/17', '05/06/17', '04/30/17', '04/25/17',
'04/26/17', '05/04/17'],
100000)
data = pd.DataFrame(dict(Day=a))
%%timeit
u = pd.unique(a)
m = dict(zip(u, pd.to_datetime(u, format='%m/%d/%y')))
data['Day'].map(m)
100 loops, best of 3: 15.4 ms per loop
%timeit pd.to_datetime(data['Day'], format='%m/%d/%y')
1 loop, best of 3: 206 ms per loop