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

计算一日内事件间隔:如何拆分跨天事件实现按天统计事件时长

实现方案

核心思路

  • 先将时间列统一转换为pandas datetime格式,保证时间计算正确性
  • 对每条事件记录,生成其时间范围内所有自然日的零点作为切割点,将原事件拆分为多个不跨天的片段
  • 重新计算每个拆分后片段的时长,合并得到最终拆分结果
  • 基于拆分结果可直接按天、按事件分组统计时长

完整可运行代码

import pandas as pd
from datetime import timedelta

# 构造原始数据(实际使用时替换为你的数据源读取逻辑)
data = {
    "date": ["2021-09-09 22:30:00", "2021-09-09 23:00:00", "2021-09-09 23:10:00", "2021-09-09 23:50:00", "2021-09-10 00:50:00"],
    "event": [1,2,1,4,4],
    "next_event": ["2021-09-09 23:00:00", "2021-09-09 23:10:00", "2021-09-09 23:50:00", "2021-09-10 00:50:00", "2021-09-12 00:50:00"],
    "duration_Minutes": [30,10,40,60,2880]
}
df = pd.DataFrame(data)

# 转换时间列为datetime类型
df["date"] = pd.to_datetime(df["date"])
df["next_event"] = pd.to_datetime(df["next_event"])

# 定义单条事件拆分函数
def split_cross_day_event(row):
    start_time = row["date"]
    end_time = row["next_event"]
    event_type = row["event"]
    split_points = []
    # 生成所有切割零点:从起始时间下一个零点开始,到结束时间前的最后一个零点
    current_cut = start_time.normalize() + timedelta(days=1)
    while current_cut < end_time:
        split_points.append(current_cut)
        current_cut += timedelta(days=1)
    # 构造拆分后的时间片段
    time_segments = [start_time] + split_points + [end_time]
    result_list = []
    for i in range(len(time_segments)-1):
        seg_start = time_segments[i]
        seg_end = time_segments[i+1]
        duration = int((seg_end - seg_start).total_seconds() // 60)
        result_list.append({
            "date": seg_start,
            "event": event_type,
            "next_event": seg_end,
            "duration_Minutes": duration
        })
    return result_list

# 应用拆分逻辑生成最终结果
split_result = []
for _, row in df.iterrows():
    split_result.extend(split_cross_day_event(row))
result_df = pd.DataFrame(split_result)

# 输出拆分结果
print(result_df)

按天分组统计事件时长

拆分完成后,直接按日期和事件分组即可得到每日各事件的总时长:

# 提取统计日期(片段起始时间所属自然日)
result_df["stat_date"] = result_df["date"].dt.date
# 分组统计
daily_event_duration = result_df.groupby(["stat_date", "event"])["duration_Minutes"].sum().reset_index()
print(daily_event_duration)

注:你提供的期望输出样例中第5行date字段值2021-09-09 00:00:00属于笔误,正确值应为2021-09-10 00:00:00,上述代码输出结果与修正后的预期完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:03:03