慢 pd.to_datetime()
Slow pd.to_datetime()
我正在读取两种非常相似的 csv 文件。
它们的长度大致相同,为 20 000 行。每条线代表每秒记录的参数。
因此,第一列是时间戳。
- 在第一个文件中,模式如下:2018-09-24 15:38
- 在第二个文件中,模式如下:2018-09-24 03:38:06 PM
在这两种情况下,命令是相同的:
data = pd.read_csv(file)
data['Timestamp'] = pd.to_datetime(data['Timestamp'])
我检查了两行的执行时间:
- pd.read 在这两种情况下同样有效
- 执行第二行代码需要大约 3 到 4 秒
唯一的区别是日期模式。我不会怀疑的。你知道为什么吗?你知道如何解决这个问题吗?
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 improvement 在 pd.__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)
我正在读取两种非常相似的 csv 文件。 它们的长度大致相同,为 20 000 行。每条线代表每秒记录的参数。 因此,第一列是时间戳。
- 在第一个文件中,模式如下:2018-09-24 15:38
- 在第二个文件中,模式如下:2018-09-24 03:38:06 PM
在这两种情况下,命令是相同的:
data = pd.read_csv(file)
data['Timestamp'] = pd.to_datetime(data['Timestamp'])
我检查了两行的执行时间:
- pd.read 在这两种情况下同样有效
- 执行第二行代码需要大约 3 到 4 秒
唯一的区别是日期模式。我不会怀疑的。你知道为什么吗?你知道如何解决这个问题吗?
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 improvement 在 pd.__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)