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

Pandas分组筛选:基于日期生成EndDate及大数据集高效处理需求

高效处理百万级员工职位数据的日期计算与筛选方案

针对30万行规模的员工职位数据,完全不需要遍历分组数据集,利用Pandas的矢量化操作和**分组移位(shift)**就能实现高效处理,步骤如下:

1. 生成EndDate列

因为数据已经按Site、EmployeeID升序,EffectiveDate降序排序,同一员工同一站点的最新职位排在最前面。我们可以按Site和EmployeeID分组后,将下一条记录的StartDate向上移位,再减去1天作为当前记录的EndDate:

import pandas as pd

# 确保StartDate为datetime类型
df['StartDate'] = pd.to_datetime(df['StartDate'])

# 分组移位获取下一条记录的StartDate,减1天得到当前记录的EndDate
df['EndDate'] = df.groupby(['Site', 'EmployeeID'])['StartDate'].shift(-1) - pd.Timedelta(days=1)

# 每组最后一条记录(最新职位)的EndDate可按需设为当前日期或空值
df['EndDate'] = df['EndDate'].fillna(pd.to_datetime('today'))

这里的shift(-1)是将分组内的下一行数据移到当前行,矢量化操作的效率远高于循环遍历,30万行数据几秒就能完成。

2. 生成Import列并筛选数据

需要判断当前职位的时间范围是否覆盖2024-07-01及之后的区间,分两种情况:

  • 职位的结束日期(EndDate)>= 2024-07-01
  • 职位为当前有效(EndDate为空或为当前日期)且开始日期(StartDate)<= 2024-07-01

用矢量化条件判断生成Import列:

target_date = pd.to_datetime('2024-07-01')

# 构建筛选条件
condition = (
    (df['EndDate'] >= target_date) |
    ((df['StartDate'] <= target_date) & df['EndDate'].isna())
)

df['Import'] = condition.map({True: 'Y', False: 'N'})

# 筛选Import为Y的数据
filtered_df = df[df['Import'] == 'Y'].copy()

关键优势

  • 完全避免Python层面的循环,所有操作基于Pandas的C底层实现,处理30万行数据的速度比遍历快几十甚至上百倍;
  • 代码简洁易维护,符合Pandas惯用写法,后续调试和修改成本低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:12:33