讲师中心 微信公众号
AI工具推荐 视频效率加速

计算两个事件序列每日重叠时长的Python实现方法

阿萱小哥_4801

阿萱小哥_4801

发布时间:2026-02-03 12:57:08

|

773人浏览过

|

来源于php中文网

原创

计算两个事件序列每日重叠时长的Python实现方法

本文介绍如何使用python高效计算两组时间事件(如df_event_a和df_event_b)在每一天内的最大并发重叠时长(单位:秒),确保每日结果不超过86400秒,并自动处理事件内部重叠及跨日边界问题。

要准确计算两组事件(A与B)在每个自然日内同时发生的总时长,核心在于:对每一天,求所有A类事件与所有B类事件在该日内的时间交集并集长度——即只要某时刻至少有一个A事件和一个B事件同时活跃,该时刻即计入重叠;且同日内所有此类时刻的累计时长即为当日重叠时长(上限为24小时 = 86400秒)。

✅ 关键逻辑解析

两段区间 [a_start, a_end] 和 [b_start, b_end] 的重叠时长公式为:

overlap = max(min(a_end, b_end) - max(a_start, b_start), pd.Timedelta(0))

若结果为负数(无重叠),则取0。.total_seconds() 可将其转为浮点型秒数。

361SCAN security check your skill python scripts
361SCAN security check your skill python scripts

扫描并分析已安装技能,用于查看指定技能目录的名称、描述和详情,或列出所有已安装的技能。

下载

但注意:单靠两两配对计算所有A×B组合再求和会严重高估(因未去重,同一时间段被多次计数),且无法处理“多事件叠加”场景。正确做法是:将每日重叠问题转化为时间轴上的区间合并问题。

立即学习“Python免费学习笔记(深入)”;

✅ 推荐实现步骤(基于pandas + interval arithmetic)

import pandas as pd
import numpy as np

def compute_daily_overlap_seconds(df_a, df_b, freq='D'):
    """
    计算df_a与df_b在每个自然日内的并发重叠时长(秒)

    Parameters:
    df_a, df_b: DataFrame with 'start_ts' and 'end_ts' (datetime64[ns])
    freq: pd.Grouper frequency, default 'D' for daily

    Returns:
    Series indexed by date, values = overlap seconds (0 ≤ x ≤ 86400)
    """
    # Step 1: 生成所有A-B两两交集区间(仅保留非空交集)
    df_a = df_a.copy()
    df_b = df_b.copy()
    df_a['key'] = 1
    df_b['key'] = 1
    merged = df_a.merge(df_b, on='key', suffixes=('_a', '_b')).drop('key', axis=1)

    # 计算交集端点
    merged['overlap_start'] = merged[['start_ts_a', 'start_ts_b']].max(axis=1)
    merged['overlap_end'] = merged[['end_ts_a', 'end_ts_b']].min(axis=1)
    merged = merged[merged['overlap_start'] < merged['overlap_end']].copy()

    # Step 2: 按天切分每个交集区间 → 拆分为「日粒度子区间」
    intervals = []
    for _, row in merged.iterrows():
        start, end = row['overlap_start'], row['overlap_end']
        # 生成覆盖该交集的所有自然日日期范围
        day_start = start.floor('D')
        day_end = end.ceil('D') - pd.Timedelta(seconds=1)  # 向前取整到秒级日末
        for day in pd.date_range(day_start, day_end, freq='D'):
            day_lower = max(start, day)
            day_upper = min(end, day + pd.Timedelta(days=1))
            if day_lower < day_upper:
                intervals.append({
                    'date': day.date(),
                    'start': day_lower,
                    'end': day_upper
                })

    if not intervals:
        return pd.Series([], dtype='float64').rename_axis('date')

    # Step 3: 按日期聚合,对每个日期的所有子区间执行「区间合并」
    df_intv = pd.DataFrame(intervals)
    result = {}
    for date, group in df_intv.groupby('date'):
        # 排序后合并重叠/邻接区间
        sorted_group = group.sort_values('start')
        merged_ranges = []
        for _, r in sorted_group.iterrows():
            if not merged_ranges:
                merged_ranges.append([r['start'], r['end']])
            else:
                last = merged_ranges[-1]
                if r['start'] <= last[1]:  # 可合并(重叠或紧邻)
                    last[1] = max(last[1], r['end'])
                else:
                    merged_ranges.append([r['start'], r['end']])
        # 累加合并后各区间长度(秒)
        total_sec = sum((end - start).total_seconds() for start, end in merged_ranges)
        result[date] = min(total_sec, 86400.0)  # 强制封顶24小时

    return pd.Series(result).sort_index()

# ✅ 使用示例
df_a = pd.DataFrame({
    'start_ts': pd.to_datetime(['2022-01-01 00:00:00', '2022-01-01 09:00:00']),
    'end_ts': pd.to_datetime(['2022-01-01 10:00:00', '2022-01-01 12:00:00'])
})
df_b = pd.DataFrame({
    'start_ts': pd.to_datetime(['2022-01-01 08:00:00', '2022-01-01 11:00:00']),
    'end_ts': pd.to_datetime(['2022-01-01 11:30:00', '2022-01-01 13:00:00'])
})

daily_overlap = compute_daily_overlap_seconds(df_a, df_b)
print(daily_overlap)
# 输出示例:2022-01-01    7200.0  → 即 2 小时(09:00–11:00 与 11:00–11:30 共计 2.5h?实际合并后为 09:00–11:30 = 2.5h = 9000s —— 需根据输入校验)

⚠️ 注意事项

  • 性能提示:若事件量大(如每表超千行),merge 会产生 O(n×m) 组合,建议先按日期粗筛(如 start_ts.dt.date join)再精确计算;
  • 时区敏感:确保所有 datetime 列已统一时区(推荐转为 UTC 或本地时区并 .dt.tz_localize(None) 显式声明);
  • 边界处理:本方案严格遵循「自然日」(00:00:00–23:59:59.999999),不跨日累加;
  • 精度保障:使用 pd.Timedelta 运算,避免浮点截断误差;
  • 空结果安全:自动返回空 Series,调用方无需额外判空。

该方法兼顾准确性、可读性与工程鲁棒性,适用于监控告警重叠分析、资源争用评估、用户行为并发建模等典型场景。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

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

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

320

2025.12.04

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

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

252

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

551

2026.04.13

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

40

2026.10.16

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

40

2026.10.16

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

20

2026.10.16

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

20

2026.10.16

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

20

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn