0

0

计算两个事件序列的每日重叠时长(秒级精度)

花韻仙語

花韻仙語

发布时间:2026-02-03 20:33:01

|

633人浏览过

|

来源于php中文网

原创

计算两个事件序列的每日重叠时长(秒级精度)

本文介绍如何使用 python 计算两个事件数据集(df_event_a 和 df_event_b)在每一天内发生的**跨集合时间重叠总时长**,结果以秒为单位,且单日最大值不超过 86400 秒(24 小时)。

要准确计算 A 类事件与 B 类事件在每日粒度上的并发持续时间,核心在于:对每一对可能跨日相交的 (A, B) 事件,先求其时间交集区间,再将该交集按自然日切分,最后汇总每天的有效重叠秒数(注意:同一天内多个重叠片段需合并去重,避免重复计时;且单日总和不可超过 86400 秒)。

✅ 关键逻辑说明

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

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

若结果为负或零,则无重叠;否则 .total_seconds() 即得重叠秒数。

剪映专业版
剪映专业版

一款全能易用的桌面端剪辑软件

下载

直接两两计算所有组合再按天 sum() 会高估——因为:

  • 同一天内多个 A/B 事件可能产生多段重叠,存在时间覆盖;
  • 重叠区域本身可能横跨多日(如 A: 2022-01-01 22:00 → 2022-01-02 03:00,B: 2022-01-01 23:00 → 2022-01-02 04:00),需拆分为 2022-01-01 和 2022-01-02 两天分别计算。

✅ 推荐实现步骤(使用 pandas + numpy)

import pandas as pd
import numpy as np

def compute_daily_overlap_seconds(df_a, df_b, freq='D'):
    """
    计算 df_a 与 df_b 在每一天的并发总时长(秒),自动去重、截断至 86400s/天
    要求:df_a / df_b 包含列 'start_ts', 'end_ts',类型为 datetime64[ns]
    """
    # 确保时间列是 datetime
    for df in [df_a, df_b]:
        df['start_ts'] = pd.to_datetime(df['start_ts'])
        df['end_ts'] = pd.to_datetime(df['end_ts'])

    # 生成所有 (a, b) 组合(笛卡尔积)
    df_a = df_a.assign(_key=1)
    df_b = df_b.assign(_key=1)
    joined = df_a.merge(df_b, on='_key', suffixes=('_a', '_b')).drop(columns='_key')

    # 计算每对事件的全局重叠区间
    joined['overlap_start'] = joined[['start_ts_a', 'start_ts_b']].max(axis=1)
    joined['overlap_end'] = joined[['end_ts_a', 'end_ts_b']].min(axis=1)
    joined['raw_overlap'] = (joined['overlap_end'] - joined['overlap_start']).clip(lower=pd.Timedelta(0))

    # 过滤掉无重叠的行
    valid = joined[joined['raw_overlap'] > pd.Timedelta(0)].copy()

    if valid.empty:
        # 返回空日期索引的 Series
        return pd.Series([], dtype='float64')

    # 拆分跨日重叠:对每个重叠区间,生成其覆盖的每一天的 [day_start, day_end]
    records = []
    for _, row in valid.iterrows():
        start, end = row['overlap_start'], row['overlap_end']
        # 生成该重叠区间覆盖的所有自然日
        days = pd.date_range(start.date(), end.date(), freq='D')
        for day in days:
            day_start = max(start, pd.Timestamp(day.date()))
            day_end = min(end, pd.Timestamp(day.date()) + pd.Timedelta('1D'))
            duration_sec = (day_end - day_start).total_seconds()
            if duration_sec > 0:
                records.append({'date': day.date(), 'seconds': duration_sec})

    # 转为 DataFrame 并按日聚合(合并同日所有片段)
    if not records:
        return pd.Series([], dtype='float64')

    daily_df = pd.DataFrame(records)
    daily_total = daily_df.groupby('date')['seconds'].sum().round().astype(int)

    # 强制单日上限为 86400 秒(24 小时)
    daily_total = daily_total.clip(upper=86400)

    # 补全缺失日期(可选):若需连续日期索引,可用 resample
    # daily_total = daily_total.resample('D').sum().fillna(0).astype(int)

    return daily_total

# 示例用法:
# result = compute_daily_overlap_seconds(df_event_a, df_event_b)
# print(result)

⚠️ 注意事项

  • 性能提示:若事件量大(如各超万条),笛卡尔积可能内存爆炸。此时建议改用区间树(如 intervaltree 库)或分天预过滤(先按日期分桶,再在同一天内做交叉)。
  • 时区敏感:确保所有 datetime 列已统一时区(推荐转为 UTC 或本地 tz-aware),否则跨日计算易出错。
  • 边界处理:本实现采用左闭右开语义([start, end)),符合 pandas 时间差惯例;若业务需包含终点,请在 end_ts 上加 1ns 再计算。
  • 输出解释:返回 pd.Series,索引为 datetime.date,值为当日 A 与 B 同时活跃的去重总秒数,严格 ≤ 86400。

通过该方法,你可精准量化系统中两类事件(如服务请求 vs 资源维护、用户在线 vs 推送发送)的真实并发压力,为容量规划与 SLA 分析提供可靠依据。

热门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 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

2

2026.01.31

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

13

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

22

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

13

2026.02.03

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

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

2

2026.02.03

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

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

11

2026.02.03

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

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

101

2026.02.03

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

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

2

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号