如何快速将超大型CSV文件读取为Pandas DataFrame?已用参数仍耗时过久
优化pd.read_csv读取100万行CSV的速度方案
针对你当前的读取参数,以下是几个直接有效的优化方向,按优先级排序:
1. 显式指定日期格式,替代自动推断
infer_datetime_format=True虽比不推断快,但直接指定Timestamp的格式能彻底跳过推断步骤,大幅降低日期解析耗时。根据你提到的Timestamp包含秒数,替换成对应格式(比如常见的%Y-%m-%d %H:%M:%S,请根据实际格式调整):
pd.read_csv(file, index_col='Timestamp', engine='c', na_filter=False, parse_dates=['Timestamp'], date_parser=lambda x: pd.to_datetime(x, format='%Y-%m-%d %H:%M:%S'), low_memory=False)
pandas 1.0+版本可直接用更简洁的写法:
pd.read_csv(file, index_col='Timestamp', engine='c', na_filter=False, parse_dates={'Timestamp': {'format': '%Y-%m-%d %H:%M:%S'}}, low_memory=False)
2. 预定义所有列的数据类型
low_memory=True会分块推断列类型,既耗时又可能导致同一列出现混合类型。提前指定dtype参数,让pandas直接按指定类型读取,避免类型推断开销:
- 数值列:精度允许时用
int32/float32代替默认的int64/float64,减少内存占用同时加快读取; - 字符串列:重复值较多时用
category类型,大幅降低内存和读取时间;
示例:
pd.read_csv(file, index_col='Timestamp', engine='c', na_filter=False, parse_dates={'Timestamp': {'format': '%Y-%m-%d %H:%M:%S'}}, dtype={ 'column1': 'int32', 'column2': 'float32', 'column3': 'category' }, low_memory=False)
3. 只读取需要的列
如果不需要CSV中的所有列,用usecols参数指定目标列,减少IO读取的数据量,对速度提升非常明显:
pd.read_csv(file, index_col='Timestamp', engine='c', na_filter=False, parse_dates={'Timestamp': {'format': '%Y-%m-%d %H:%M:%S'}}, dtype={...}, usecols=['Timestamp', 'column1', 'column2'], low_memory=False)
4. 尝试替代库(适合更大规模数据)
如果上述优化后仍不够快,可以尝试多线程/分布式读取库:
- Modin:直接替换pandas导入,自动利用多线程读取,代码几乎不变:
import modin.pandas as pd pd.read_csv(...) # 用你优化后的参数 - Dask:适合超大规模数据,分块读取处理,内存占用更低:
import dask.dataframe as dd df = dd.read_csv(file, ...).compute() # compute()转为pandas dataframe
内容的提问来源于stack exchange,提问作者Roosha
相关产品推荐
相关产品推荐

