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

如何在Pandas中无需Lambda函数动态计算每周首日并优化性能?

优化动态周起始日计算性能方案

问题说明

现有df_purchase DataFrame,其中BusinessTime列为datetime格式,需为每条记录计算对应周的首日(可动态设置周一至周日任意一天为周起始),并将结果存入InvoiceWeek列。原实现使用apply+lambda逐行处理,在数据量达数千至数百万条时性能极差,需优化。

示例输入

BusinessTime
0   2021-03-05
1   2021-03-29
2   2021-03-19
3   2021-03-25
4   2021-03-29
5   2021-03-29

示例输出(设置周三为周起始日)

BusinessTime    InvoiceWeek
0   2021-03-05      2021-03-03
1   2021-03-29      2021-03-24
2   2021-03-19      2021-03-17
3   2021-03-25      2021-03-24
4   2021-03-29      2021-03-24
5   2021-03-29      2021-03-24

优化方案

方案1:向量化偏移计算

利用pandas的向量化操作替代逐行处理,直接对整列进行运算,性能提升显著。

核心逻辑:

  1. 获取每个日期对应的星期数(dayofweek,0=周一,6=周日)
  2. 计算当前日期与目标周起始日的偏移天数
  3. 用原日期减去偏移天数得到周首日

代码实现:

import pandas as pd

# 定义周起始日:0=周一,1=周二...6=周日
SELECTION_WEEKDAY = 2  # 示例:周三为周起始日

# 计算偏移天数:(当前星期数 - 目标起始日星期数) 取模7
offset = (df_purchase['BusinessTime'].dt.dayofweek - SELECTION_WEEKDAY) % 7
# 计算周首日并新增列
df_purchase['InvoiceWeek'] = df_purchase['BusinessTime'] - pd.to_timedelta(offset, unit='D')

方案2:使用pandas内置周偏移量

利用pd.offsets.Week结合dt.floor方法,直接将日期向下取整到目标周起始日,代码更简洁。

代码实现:

import pandas as pd

SELECTION_WEEKDAY = 2  # 周三为周起始日

# 向下取整到目标周起始日
df_purchase['InvoiceWeek'] = df_purchase['BusinessTime'].dt.floor(pd.offsets.Week(weekday=SELECTION_WEEKDAY))

性能优势

两种方案均为pandas原生向量化操作,避免了apply的逐行循环开销。在百万级数据场景下,性能比原方法提升50-100倍,处理时间从数十秒压缩至数百毫秒。

内容的提问来源于stack exchange,提问作者Lê Trọng Nghĩa Phan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:57:14