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

Pandas如何统计每个长事件时间区间内包含的短事件记录数?

解决方法

方法1:直接使用你编写的函数配合apply实现

你写的计数逻辑是正确的,只需要将函数应用在长事件表上即可,因为我们需要为每一个长事件统计对应的短事件数量,代码如下:

# 预先定义好的计数函数
def count_records_in_time_range(df, start, end):
    return len(df[(df['start'] >= start) & (df['end'] <= end)])

# 假设长事件表变量名为df_long,短事件表变量名为df_short
df_long['count of sub events'] = df_long.apply(
    lambda row: count_records_in_time_range(df_short, row['start'], row['end']),
    axis=1
)

运行后df_long就是你需要的结果。

方法2:用IntervalIndex优化性能(适合大数据量场景)

如果你的数据量较大,逐行apply的效率偏低,可以用Pandas的区间索引实现批量匹配,性能提升明显:

import pandas as pd

# 为长事件表创建闭区间索引
df_long = df_long.set_index(pd.IntervalIndex.from_arrays(
    df_long['start'], df_long['end'], closed='both'
))
# 匹配每个短事件所属的长事件区间,统计各区间数量
event_counts = df_short['start'].apply(
    lambda x: df_long.index.get_indexer([x])[0]
).value_counts().sort_index()
# 将计数结果回写长事件表
df_long['count of sub events'] = event_counts.values
# 重置索引恢复原始结构
df_long = df_long.reset_index(drop=True)

注:如果你的业务逻辑里时间区间是左闭右开规则,只需要将上面的closed='both'改成closed='left',同时调整计数函数里的判断条件即可,你提供的示例中长短事件边界完全对齐,两种规则结果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:15:06