0

0

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

花韻仙語

花韻仙語

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

|

713人浏览过

|

来源于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() 可将其转为浮点型秒数。

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

DeepBrain
DeepBrain

AI视频生成工具,ChatGPT +生成式视频AI =你可以制作伟大的视频!

下载

立即学习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工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

71

2025.12.04

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

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

1

2026.01.31

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

0

2026.02.03

漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题
漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题

本专题围绕漫蛙漫画(Manwa / Manwa2)官网网页版入口进行整理,涵盖漫蛙漫画官方主页访问方式、网页版在线阅读入口、台版正版漫画浏览说明及基础使用指引,帮助用户快速进入漫蛙漫画官网,稳定在线阅读正版漫画内容,避免误入非官方页面。

0

2026.02.03

Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口
Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口

本专题汇总了俄罗斯知名搜索引擎 Yandex 的官网入口、免登录访问地址、中文登录方法与网页版使用指南,帮助用户稳定访问 Yandex 官网,并提供一站式入口汇总。无论是登录入口还是在线搜索,用户都能快速获取最新稳定的访问链接与使用指南。

2

2026.02.03

Java 设计模式与重构实践
Java 设计模式与重构实践

本专题专注讲解 Java 中常用的设计模式,包括单例模式、工厂模式、观察者模式、策略模式等,并结合代码重构实践,帮助学习者掌握 如何运用设计模式优化代码结构,提高代码的可读性、可维护性和扩展性。通过具体示例,展示设计模式如何解决实际开发中的复杂问题。

2

2026.02.03

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

0

2026.02.03

Python 强化学习与深度Q网络(DQN)
Python 强化学习与深度Q网络(DQN)

本专题深入讲解 Python 在强化学习(Reinforcement Learning)中的应用,重点介绍 深度Q网络(DQN) 及其实现方法,涵盖 Q-learning 算法、深度学习与神经网络的结合、环境模拟与奖励机制设计、探索与利用的平衡等。通过构建一个简单的游戏AI,帮助学习者掌握 如何使用 Python 训练智能体在动态环境中作出决策。

2

2026.02.03

python end=
python end=

本专题整合了python中end=的相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.03

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

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

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