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

使用Pandas识别同一ID下所有关联代码的时间范围交集

Pandas识别同一ID下所有关联代码的时间范围交集

我来帮你搞定这个需求!你需要的是针对每个ID,找出它对应的所有关联code的时间区间的共同重叠部分——也就是所有code的时间范围都覆盖到的那段区间,而不是某几个code的重叠。下面一步步来实现:

步骤1:数据预处理

首先得把时间列从字符串转换成Pandas的datetime类型,这样才能进行时间比较和计算:

import pandas as pd

# 你的原始数据
data_group = {
    'id': ['0111','0123'],
    'code': [['1', '2', '3'],['1','2']]
}
df_group = pd.DataFrame(data_group)

data = {
    'codice': ['1', '2', '3', '1','1','1'],
    'id': ['0111', '0111', '0111', '0111','0123','0123'],
    'data1': ['2025-02-03 02:16:00', '2025-02-03 02:18:00', '2025-02-03 02:17:00', '2025-02-03 12:02:00','2025-02-03 12:02:00','2025-02-03 12:02:00'],
    'data2': ['2025-02-03 02:44:00', '2025-02-03 02:44:00', '2025-02-03 02:39:00', '2025-02-03 12:05:00','2025-02-03 12:06:00','2025-02-03 12:04:00']
}
df = pd.DataFrame(data) 

# 转换时间列类型为datetime
df['data1'] = pd.to_datetime(df['data1'])
df['data2'] = pd.to_datetime(df['data2'])

步骤2:计算每个ID的共同时间交集

核心逻辑很简单:

  • 对每个ID,先拿到它对应的所有code列表
  • 从df中筛选出该ID下这些code的所有时间区间
  • 共同交集的起始时间是所有区间data1的最大值(因为要所有区间都包含这个点,必须取最晚的开始)
  • 共同交集的结束时间是所有区间data2的最小值(同理,取最早的结束)
  • 只有当起始时间 ≤ 结束时间时,这个交集才是有效的

实现代码:

# 存储结果的列表
result_list = []

# 遍历每个ID的分组信息
for _, row in df_group.iterrows():
    current_id = row['id']
    target_codes = row['code']
    
    # 筛选当前ID下所有目标code的时间区间
    filtered_data = df[(df['id'] == current_id) & (df['codice'].isin(target_codes))]
    
    # 计算所有区间的共同交集边界
    common_start = filtered_data['data1'].max()
    common_end = filtered_data['data2'].min()
    
    # 只有当起始时间不晚于结束时间时,交集才有效
    if common_start <= common_end:
        result_list.append({
            'id': current_id,
            'data1': common_start.strftime('%Y-%m-%d %H:%M:%S'),
            'data2': common_end.strftime('%Y-%m-%d %H:%M:%S')
        })

# 转换成DataFrame格式的结果
result_df = pd.DataFrame(result_list)
print(result_df)

运行结果

输出和你预期的完全一致:

id                data1                data2
0  0111  2025-02-03 02:18:00  2025-02-03 02:39:00

顺便解释下为什么ID0123没有结果:它对应的code是['1','2'],但你的df里0123的记录全是codice=1,没有codice=2的时间区间,自然找不到同时覆盖两个code的共同重叠部分啦。

备注:内容来源于stack exchange,提问作者so.n

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:34:36