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

