小编典典

为什么非标准时间格式(例如“ 2014/12/31”)的pandas.to_datetime变慢

python

我有这样格式的.csv文件

timestmp, p
2014/12/31 00:31:01:9200, 0.7
2014/12/31 00:31:12:1700, 1.9
...

并且当通过读取pd.read_csv并将time str转换为datetime时pd.to_datetime,性能会急剧下降。这是一个最小的示例。

import re
import pandas as pd

d = '2014-12-12 01:02:03.0030'
c = re.sub('-', '/', d)

%timeit pd.to_datetime(d)
%timeit pd.to_datetime(c)
%timeit pd.to_datetime(c, format="%Y/%m/%d %H:%M:%S.%f")

表演有:

10000 loops, best of 3: 62.4 µs per loop
10000 loops, best of 3: 181 µs per loop
10000 loops, best of 3: 82.9 µs per loop

因此,如何pd.to_datetime从csv文件读取日期时的性能?


阅读 219

收藏
2020-12-20

共1个答案

小编典典

这是因为当pandasdateutil.parser.parse具有非默认格式或未format提供任何字符串时,pandas会后退以解析字符串(这更加灵活,但速度也较慢)。

如上所示,您可以通过向提供format字符串来提高性能to_datetime。或者另一个选择是使用infer_datetime_format=True


显然,infer_datetime_format当存在微秒时,无法推断。在没有这些示例的情况下,您可以看到大幅提高了速度:

In [28]: d = '2014-12-24 01:02:03'

In [29]: c = re.sub('-', '/', d)

In [30]: s_c = pd.Series([c]*10000)

In [31]: %timeit pd.to_datetime(s_c)
1 loops, best of 3: 1.14 s per loop

In [32]: %timeit pd.to_datetime(s_c, infer_datetime_format=True)
10 loops, best of 3: 105 ms per loop

In [33]: %timeit pd.to_datetime(s_c, format="%Y/%m/%d %H:%M:%S")
10 loops, best of 3: 99.5 ms per loop
2020-12-20