慢 pd.to_datetime()

Slow pd.to_datetime()

我正在读取两种非常相似的 csv 文件。 它们的长度大致相同,为 20 000 行。每条线代表每秒记录的参数。 因此,第一列是时间戳。

在这两种情况下,命令是相同的:

data = pd.read_csv(file)
data['Timestamp'] = pd.to_datetime(data['Timestamp'])

我检查了两行的执行时间:

唯一的区别是日期模式。我不会怀疑的。你知道为什么吗?你知道如何解决这个问题吗?

pandas.to_datetime 在需要自动解析日期时(在某些情况下)非常慢。既然你知道这些格式,你应该明确地将它们传递给 format 参数,这将大大提高速度。

这是一个例子:

import pandas as pd
df1 = pd.DataFrame({'Timestamp': ['2018-09-24 15:38:06']*10**5})
df2 = pd.DataFrame({'Timestamp': ['2018-09-24 03:38:06 PM']*10**5})

%timeit pd.to_datetime(df1.Timestamp)
#21 ms ± 50.4 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit pd.to_datetime(df2.Timestamp)
#14.3 s ± 122 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

慢了 700 倍。现在明确指定格式:

%timeit pd.to_datetime(df2.Timestamp, format='%Y-%m-%d %I:%M:%S %p')
#384 ms ± 1.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

pandas 解析第二个日期格式的速度仍然较慢,但已经没有以前那么糟糕了。


编辑:从 pd.__version__ == '1.0.5' 开始,自动解析对于过去解析速度极慢的格式似乎已经变得更好,这可能是由于 this performance improvementpd.__version == '0.25.0' 中的实施

import pandas as pd
df1 = pd.DataFrame({'Timestamp': ['2018-09-24 15:38:06']*10**5})
df2 = pd.DataFrame({'Timestamp': ['2018-09-24 03:38:06 PM']*10**5})

%timeit pd.to_datetime(df1.Timestamp)
#9.01 ms ± 294 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit pd.to_datetime(df2.Timestamp)
#9.1 ms ± 267 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)