如何高效读取含timedelta与NaN的CSV文件?
优化Pandas读取大规模时间差CSV的速度
嘿,我完全懂处理超大CSV时applymap慢到让人抓狂的感觉——逐元素转换本来就不是Pandas的强项,咱们换几个向量化/批量处理的方案,速度能提升一大截:
方案1:读取时直接转换(最推荐)
与其先把所有数据读成object类型再事后转换,不如在read_csv阶段就完成转换,利用Pandas的批量处理能力:
import pandas as pd # 先获取所有需要转换的数据列(跳过索引列) data_cols = pd.read_csv('file.csv', nrows=0).columns[1:] # 为每个数据列指定转换函数 converters = {col: pd.to_timedelta for col in data_cols} # 读取CSV时直接完成转换 df = pd.read_csv('file.csv', sep=',', index_col=0, converters=converters)
这个方法的优势是边读边转,不需要额外的内存存储原始object类型数据,而且是按列批量处理,比逐元素操作快得多。
方案2:已读入DataFrame时的批量转换
如果已经把数据读成了object类型的DataFrame,别用applymap,改用向量化的pd.to_timedelta批量处理:
# 假设df是已读入的object类型DataFrame df = pd.to_timedelta(df.stack()).unstack()
这里用stack()把整个DataFrame压缩成一个Series,然后一次性用pd.to_timedelta转换所有元素,最后unstack()还原成原来的行列结构。这种向量化操作的速度比applymap快几个数量级,因为它是底层用C实现的,而非Python层面的逐元素循环。
额外提醒
- 两种方案都会自动把原始的
NaN转换成时间差类型的NaT,和你原来的需求完全匹配。 - 如果你的文件大到Pandas内存都扛不住,可以试试
dask.dataframe做并行处理,但上面的两个方案基本能覆盖绝大多数场景了。
内容的提问来源于stack exchange,提问作者jssm
相关产品推荐
相关产品推荐

