优化对象列日期过滤性能:NYC车祸数据集提取2017年数据
嘿,这个问题我在处理大型时间序列数据集时经常碰到——事后转换日期类型再筛选确实会拖慢速度,尤其是当数据集很大的时候。给你几个亲测有效的提速方案,你可以根据自己的情况选:
提前在读取CSV时解析日期
不要先把DATE列读成object类型再事后转换,直接在pd.read_csv阶段就完成日期解析,pandas在读取时做类型转换的效率要高得多。如果你的DATE列是标准格式(比如MM/DD/YYYY或YYYY-MM-DD),可以直接用parse_dates参数:import pandas as pd # 读取时直接解析DATE列为datetime类型 data = pd.read_csv('nyc_crashes.csv', parse_dates=['DATE']) # 再筛选2017年数据 data = data[data['DATE'].dt.year == 2017]如果日期格式不标准,记得加上
format参数指定格式(比如format='%m/%d/%Y'),避免pandas自动推断格式带来的额外耗时。直接通过字符串切片筛选(最快的轻量方案)
如果你的DATE列格式完全统一(比如所有记录都是MM/DD/YYYY或DD-MM-YYYY这种年份在固定位置的格式),可以跳过datetime转换,直接对字符串切片取年份进行筛选,这会比日期转换快好几倍:# 假设DATE格式是MM/DD/YYYY,年份在最后四位 data = data[data['DATE'].str[-4:] == '2017'] # 或者转成整数比较(更严谨,避免字符串匹配的潜在问题) data = data[data['DATE'].str[-4:].astype(int) == 2017]注意:这个方案只适用于日期格式完全统一的情况,如果有部分记录格式不一致,会导致筛选错误。
用PyArrow引擎加速读取和转换
如果你用的是pandas 2.0+版本,可以借助PyArrow作为CSV读取引擎,它的日期解析和类型转换效率比默认的engine高很多,尤其适合超大数据集:data = pd.read_csv('nyc_crashes.csv', parse_dates=['DATE'], engine='pyarrow') data = data[data['DATE'].dt.year == 2017]用Dask处理超大型数据集(内存不足时用)
如果你的CSV文件大到无法一次性加载到内存,试试用Dask来分块处理,它会自动把数据集拆分成小块并行处理,既节省内存又提升速度:import dask.dataframe as dd # 分块读取CSV并解析日期 ddf = dd.read_csv('nyc_crashes.csv', parse_dates=['DATE']) # 筛选2017年数据 ddf = ddf[ddf['DATE'].dt.year == 2017] # 将结果转换为pandas DataFrame(如果内存够的话) data = ddf.compute()
内容的提问来源于stack exchange,提问作者BearsBeetBattlestar

