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

Pandas实现两个DataFrame时间差计算及最小差值提取

高效实现DataFrame时间差计算与最小值提取

步骤说明

1. 统一时间字段类型

首先确保两个DataFrame的时间列是Pandas的datetime类型,否则无法正确计算时间差:

import pandas as pd

# 转换为datetime类型(如果原始数据是字符串格式)
df1['Stop Time'] = pd.to_datetime(df1['Stop Time'])
df2['Start Time'] = pd.to_datetime(df2['Start Time'])

2. 批量计算所有配对的时间差delta

利用Pandas的广播机制实现两两配对计算,自动生成df1.shape[0] * df2.shape[0]规模的结果,同时将Start Time早于Stop Time的delta置为0:

# 将df1的Stop Time转为列向量,触发广播匹配df2的所有Start Time
stop_times = df1['Stop Time'].values[:, None]
start_times = df2['Start Time'].values

# 计算时间差,自动处理所有配对
delta = start_times - stop_times
# 把负时间差(Start Time更早)置为0
delta[delta < pd.Timedelta(0)] = pd.Timedelta(0)

3. 提取每条df1记录的最小delta并生成新DataFrame

对delta矩阵按行取最小值,合并到原df1中得到最终结果:

# 按行计算最小时间差,转为Series并命名
min_delta_series = pd.Series(delta.min(axis=1), name='Min Delta')

# 合并到df1,生成包含原始列和最小时间差的新DataFrame
result_df = pd.concat([df1, min_delta_series], axis=1)

进阶:按Site分组计算

如果需要只匹配同Site的记录(即df1和df2的Site相同时才计算时间差),可以用分组操作实现:

def calc_group_min_delta(df1_group):
    # 筛选同Site的df2记录
    site_matched_df2 = df2[df2['Site'] == df1_group.name]
    if site_matched_df2.empty:
        # 无匹配时返回0
        return pd.Series([pd.Timedelta(0)] * len(df1_group), index=df1_group.index)
    
    stop_times = df1_group['Stop Time'].values[:, None]
    start_times = site_matched_df2['Start Time'].values
    delta = start_times - stop_times
    delta[delta < pd.Timedelta(0)] = pd.Timedelta(0)
    return pd.Series(delta.min(axis=1), index=df1_group.index, name='Min Delta')

# 按Site分组计算后合并到df1
result_df = df1.join(df1.groupby('Site', group_keys=False).apply(calc_group_min_delta))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:25:09