【问题标题】:Slow pd.to_datetime()慢 pd.to_datetime()
【发布时间】:2018-09-24 13:47:47
【问题描述】:

我正在阅读两种非常相似的 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 秒的时间

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

【问题讨论】:

  • 使用 pd.to_datetime 的 format 参数来限制 Pandas 尝试猜测您输入的格式字符串。这将大大提高 to_datetime 的性能。

标签: python pandas string-to-datetime


【解决方案1】:

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' 开始,对于过去解析速度极慢的格式,自动解析似乎变得更好了,这可能是由于在pd.__version == '0.25.0' 中实现了this performance improvement

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)

【讨论】:

  • 根据格式,您可以改用infer_datetime_format=True,其效果几乎相同。
猜你喜欢
  • 2018-07-04
  • 2020-12-23
  • 2021-03-10
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2017-12-03
相关资源
最近更新 更多