使用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
相关产品推荐
相关产品推荐

