You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

替代Pandas .apply()的高效方案:大DataFrame日期计算内存优化

高效处理大DataFrame的日期计算方案

针对1600万行的大数据集,避免逐行操作是解决内存错误和提升效率的核心,以下是两种可行的矢量化解决方案:

方案一:使用pandas内置的dt.add_months(推荐)

如果你的pandas版本≥0.24.0,直接用dt.add_months矢量化方法,底层是C实现,速度快且内存占用低:

import pandas as pd

# 确保startDate是datetime类型(如果还不是的话)
snapshots['startDate'] = pd.to_datetime(snapshots['startDate'])

# 矢量化计算End_Date
snapshots['End_Date'] = snapshots['startDate'].dt.add_months(snapshots['projectedMonth'])

# 筛选已发生的月份
today = pd.Timestamp.today().normalize()  # 取当天0点,避免时间部分干扰
snapshots = snapshots[snapshots['End_Date'] <= today]

方案二:兼容旧版pandas的日期拆分计算

如果你的pandas版本较低,没有dt.add_months,可以通过拆分日期字段进行矢量化计算:

import pandas as pd
import numpy as np

# 确保startDate是datetime类型
snapshots['startDate'] = pd.to_datetime(snapshots['startDate'])

# 拆分日期的年、月、日
year = snapshots['startDate'].dt.year
month = snapshots['startDate'].dt.month
day = snapshots['startDate'].dt.day

# 计算总月数并转换为新的年、月
total_months = year * 12 + month + snapshots['projectedMonth']
new_year = total_months // 12
new_month = total_months % 12

# 处理月份为0的特殊情况(如1月加-1个月变为去年12月)
new_year = np.where(new_month == 0, new_year - 1, new_year)
new_month = np.where(new_month == 0, 12, new_month)

# 组合为新日期(自动处理当月无对应天数的情况,如2月30日会转为月末)
snapshots['End_Date'] = pd.to_datetime(dict(year=new_year, month=new_month, day=day))

# 筛选已发生的月份
today = pd.Timestamp.today().normalize()
snapshots = snapshots[snapshots['End_Date'] <= today]

关键说明

  • 两种方案均为矢量化操作,避免了apply逐行循环的Python级开销,内存占用仅为apply的几分之一,处理1600万行完全可行。
  • 优先使用方案一,代码更简洁,效率更高;方案二作为降级兼容方案。

内容的提问来源于stack exchange,提问作者user13948

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:05:24