如何查找各ID的重叠时间起止点?提取12点前后关键测量时间
按ID确定时间范围的最大重叠区间
问题描述
针对数据集中的每个ID,找出12:00:00之前的最早测量时间,以及12:00:00之后的最晚测量时间,以此确定所有ID的最大重叠起始时间T_start和结束时间T_end。
代码实现
首先生成示例数据(保留原始代码逻辑):
import numpy as np import pandas as pd import random # 生成示例数据集 df = pd.DataFrame({'DATE_TIME': pd.date_range('2022-11-01', '2022-11-06 23:00:00', freq='20min'), 'ID': [random.randrange(1, 20) for n in range(430)]}) # 添加特征列 df['VALUE1'] = [random.randrange(110, 140) for n in range(430)] df['VALUE2'] = [random.randrange(50, 60) for n in range(430)] df['VALUE3'] = [random.randrange(80, 100) for n in range(430)] df['VALUE4'] = [random.randrange(30, 50) for n in range(430)] df['MODEL'] = [random.randrange(1, 3) for n in range(430)] df['SOLD'] = [random.randrange(0, 2) for n in range(430)] # 衍生时间相关列 df['INSPECTION'] = df['DATE_TIME'].dt.day df['MODE'] = np.select([df['INSPECTION'] == 1, df['INSPECTION'].isin([2, 3])], ['A', 'B'], 'C') df['TIME'] = df['DATE_TIME'].dt.time # 昼夜周期划分函数 def cycle_day_period(dataframe: pd.DataFrame, midnight='00:00:00', start_of_morning='06:00:00', start_of_afternoon='13:00:00', start_of_evening='18:00:00', end_of_evening='23:00:00', start_of_night='24:00:00'): bins = [midnight, start_of_morning, start_of_afternoon, start_of_evening, end_of_evening, start_of_night] labels = ['Night', 'Morning', 'Morning', 'Night', 'Night'] return pd.cut( pd.to_timedelta(dataframe), bins=list(map(pd.Timedelta, bins)), labels=labels, right=False, ordered=False ) df['CYCLE_PART'] = cycle_day_period(df['TIME'].astype(str), '00:00:00', '06:00:00', '13:00:00', '18:00:00', '23:00:00', '24:00:00')
接下来执行核心逻辑:
# 定义12点时间对象用于比较 noon = pd.to_datetime('12:00:00').time() # 按ID分组计算每个ID的关键时间点 id_time_stats = df.groupby('ID').agg( earliest_before_noon=('DATE_TIME', lambda x: x[x.dt.time <= noon].min()), latest_after_noon=('DATE_TIME', lambda x: x[x.dt.time >= noon].max()) ).dropna() # 过滤掉没有12点前或12点后数据的ID # 计算全局最大重叠区间 T_start = id_time_stats['earliest_before_noon'].max() T_end = id_time_stats['latest_after_noon'].min() # 输出结果 print("每个ID的时间范围统计:") print(id_time_stats) print("\n最大重叠区间:") print(f"T_start: {T_start}") print(f"T_end: {T_end}")
逻辑说明
- 分组统计:对每个ID,筛选出时间早于/等于12点的记录,取最早的测量时间;筛选出时间晚于/等于12点的记录,取最晚的测量时间。
- 最大重叠区间计算:
T_start取所有ID最早12点前时间的最大值,确保该时间点之后,所有ID都存在12点前的有效测量数据。T_end取所有ID最晚12点后时间的最小值,确保该时间点之前,所有ID都存在12点后的有效测量数据。- 两者之间的区间就是所有ID数据覆盖的最大重叠时间段。
内容的提问来源于stack exchange,提问作者dspractician
相关产品推荐
相关产品推荐

