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

如何查找各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}")

逻辑说明

  1. 分组统计:对每个ID,筛选出时间早于/等于12点的记录,取最早的测量时间;筛选出时间晚于/等于12点的记录,取最晚的测量时间。
  2. 最大重叠区间计算:
    • T_start取所有ID最早12点前时间的最大值,确保该时间点之后,所有ID都存在12点前的有效测量数据。
    • T_end取所有ID最晚12点后时间的最小值,确保该时间点之前,所有ID都存在12点后的有效测量数据。
    • 两者之间的区间就是所有ID数据覆盖的最大重叠时间段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:45:04