如何加速熊猫 read_csv?

Posted

技术标签:

【中文标题】如何加速熊猫 read_csv?【英文标题】:How to speed up pandas read_csv? 【发布时间】:2016-02-23 05:14:31 【问题描述】:

我目前使用以下内容解析一个文本文件:

f = lambda s: datetime.datetime.strptime(s, '%Y-%m-%d-%H-%M-%S')
dframe = pd.read_csv(
    fname, sep=' ', header=None,
    names=('A', 'B', 'C', 'D', 'E'),
    use_unsigned=True, parse_dates=True, index_col=0, date_parser=f)

单个文件大约需要 5.70 秒。

我可以加快日期时间解析吗?

文件中的一行如下所示:

2015-04-08-11-23-27 12420.8 12430.3 12527.0 12394.2 A

谢谢,

【问题讨论】:

【参考方案1】:

您应该能够通过手动使用to_datetime 而不是使用您的 lambda 函数来加快速度:

>>> %time df = pd.read_csv(fname, delim_whitespace=True, header=None, 
          names=('A', 'B', 'C', 'D', 'E'), use_unsigned=True, parse_dates=True, 
          index_col=0, date_parser=f)
CPU times: user 9.16 s, sys: 39.9 ms, total: 9.2 s
Wall time: 9.2 s

对比

>>> %time df2 = pd.read_csv(fname, delim_whitespace=True, header=None, names=('A', 'B', 'C', 'D', 'E'), use_unsigned=True, parse_dates=False, index_col=0)
CPU times: user 416 ms, sys: 20 ms, total: 436 ms
Wall time: 435 ms
>>> %time df2.index = pd.to_datetime(df2.index, format="%Y-%m-%d-%H-%M-%S")
CPU times: user 2.72 s, sys: 4 ms, total: 2.72 s
Wall time: 2.72 s
>>> 
>>> df.equals(df2)
True
>>> (2.72+0.435)/9.2
0.3429347826086957

(我使用的是delim_whitespace=True,因为在这种情况下这往往会稍微快一些。)

【讨论】:

你的意思可能是 df2.index = pd.to_datetime(df2.index, format="%Y-%m-%d-%H-%M-%S") ?

以上是关于如何加速熊猫 read_csv?的主要内容,如果未能解决你的问题,请参考以下文章

模块“熊猫”没有属性“read_csv”

熊猫 read_csv 和 UTF-16

尾随分隔符使熊猫 read_csv 感到困惑

熊猫 read_csv() 给出 DtypeWarning

来自 BytesIO 的熊猫 read_csv

熊猫的 read_csv 总是在小文件上崩溃