0

0

Pandas 分组动态起始点的逆向工作日累计日期计算教程

碧海醫心

碧海醫心

发布时间:2026-03-11 13:35:24

|

739人浏览过

|

来源于php中文网

原创

本文详解如何在 pandas 中实现按组分段、以首个非空日期为动态起点、逆序回推业务工作日(跳过周末)的日期计算,完美解决多起点、多零值、跨组边界等复杂场景。

本文详解如何在 pandas 中实现按组分段、以首个非空日期为动态起点、逆序回推业务工作日(跳过周末)的日期计算,完美解决多起点、多零值、跨组边界等复杂场景。

在实际业务调度(如供应链交期倒排、项目里程碑回溯)中,常需基于每组内首个有效基准日期(而非固定末行),逆向逐行减去工作日天数(LT 列),并严格跳过周六、周日——即使用 BusinessDay 偏移而非简单日历日。传统 cumsum() + bfill() 或全局 groupby().cumsum() 均无法同时满足「动态起始点」与「工作日语义」两大要求。本文提供一套鲁棒、可扩展的解决方案。

核心思路:双层分组识别逻辑段

关键在于将每个 Group 进一步切分为若干逻辑计算段(segment):每段以该组内首个非空 Start 且对应 LT == 0 的行为起点,之后所有 NaN 行均归属此段;而后续再次出现的非空 Start(即使 LT != 0)则开启新段。注意:示例中 Group C 有三个非空 Start(索引 7/8/9),但仅索引 7 是首个非空且 LT==0,因此整组从索引 7 开始向前回推,索引 8 和 9 作为“锚定终点”保留原值,不参与倒推。

我们通过布尔序列 s = df['LT'].eq(0) 标记所有 LT == 0 的行,再结合 cumsum() 构建段标识:

s = df['LT'].eq(0)
grp = s.groupby(df['Group']).cumsum() - s  # 确保每个段以首个 LT==0 行为基准

grp 为每行分配唯一段 ID(同组内连续 LT==0 行共享同一 ID,首个 LT==0 前的 NaN 行被归入前一段)。

逆向累积工作日偏移量

对 LT 列执行逆序遍历 + 双重分组累积求和,再映射为 BusinessDay 偏移对象:

蛙蛙写作——超级AI智能写作助手
蛙蛙写作——超级AI智能写作助手

蛙蛙写作辅助AI写文,帮助获取创意灵感,提供拆书、小说转剧本、视频生成等功能,是一款功能全面的AI智能写作工具。

下载
s1 = (df.loc[::-1, 'LT']
      .groupby([df['Group'], grp]).cumsum()
      .apply(pd.offsets.BusinessDay)
)
  • df.loc[::-1, 'LT']:从底向上读取 LT 值;
  • .groupby([df['Group'], grp]):确保每个逻辑段独立累加(避免跨段污染);
  • .cumsum():得到该段内从末行到当前行的累计工作日数;
  • .apply(pd.offsets.BusinessDay):将整数天数转为 BusinessDay(n) 对象,支持后续日期运算。

锚定起点并执行日期运算

对每个逻辑段,提取其首个非空 Start 值(即该段基准日期),然后统一减去对应 BusinessDay 偏移量:

base_dates = df.groupby(['Group', grp])['Start'].transform('first')
result_dates = base_dates.sub(s1).dt.strftime('%d-%m-%Y')  # 格式化输出
df['Start'] = result_dates  # 写回原列

transform('first') 自动沿用 Group+grp 分组,精准捕获每段第一个有效 Start(自动跳过 NaT)。

完整可运行示例

import pandas as pd

# 构造示例数据
data = {
    'Group': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],
    'LT': [5, 10, 0, 3, 0, 2, 4, 0, 0, 0],
    'Start': [None, None, '20-03-2024', None, '04-03-2024', None, None, '04-04-2024', '10-04-2024', '24-04-2024']
}
df = pd.DataFrame(data)

# 步骤1:转换为 datetime,强制解析为 DD-MM-YYYY 格式
df['Start'] = pd.to_datetime(df['Start'], errors='coerce', format='%d-%m-%Y')

# 步骤2:构建逻辑段标识
s = df['LT'].eq(0)
grp = s.groupby(df['Group']).cumsum() - s

# 步骤3:逆向计算各段内累计工作日偏移
s1 = (df.loc[::-1, 'LT']
      .groupby([df['Group'], grp]).cumsum()
      .apply(pd.offsets.BusinessDay)
)

# 步骤4:按段取首日期并减去偏移,格式化写回
df['Start'] = (df.groupby(['Group', grp])['Start'].transform('first')
              .sub(s1)
              .dt.strftime('%d-%m-%Y'))

print(df)

✅ 输出完全匹配预期结果,且天然支持:

  • 同组内多个 LT == 0 锚点(如 Group C 的三处 Start);
  • Start 列含 NaT 或中间断续非空值;
  • LT 为 0 的行自动作为“不可回推”的终点。

注意事项与最佳实践

  • 时区与本地化:BusinessDay 默认使用 pandas.tseries.offsets.BusinessDay,不考虑节假日;如需中国法定假日,应继承 CustomBusinessDay 并传入 holidays 参数;
  • 性能优化:对超大数据集,可先 df = df.sort_values(['Group', 'index']) 避免 loc[::-1] 触发隐式拷贝;
  • 空组防护:若某组全为 NaT,transform('first') 返回 NaT,减法后仍为 NaT,符合业务预期;
  • 调试技巧:打印 grp 和 s1 中间变量,验证分段逻辑是否符合直觉(如 Group C 的 grp 应为 [0,0,0,0,0,1,1,1,1,1])。

该方案将“动态起点识别”与“工作日语义计算”解耦为清晰的两阶段处理,兼顾准确性、可维护性与泛化能力,是 Pandas 时间序列调度类任务的推荐范式。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

78

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

32

2026.01.31

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

112

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

99

2025.11.13

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

36

2025.12.30

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

93

2026.03.06

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

48

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

93

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号