pandas DataFrame中忽略秒值比对日期 实现跨表计数字段匹配更新的方法
高效实现方案
前置预处理
首先确保两个数据集的date字段为datetime类型(若已完成类型转换可跳过该步):
import pandas as pd # 转换时间字段类型 df1['date'] = pd.to_datetime(df1['date']) df2['date'] = pd.to_datetime(df2['date'])
生成分钟级匹配键
对第一份带随机秒值的数据集df1,使用pandas向量化方法将时间截断为整分钟格式,完全对齐第二份数据集的时间粒度:
# 将时间向下取整到分钟,秒值自动归零 df1['date_min'] = df1['date'].dt.floor('min')
(可选)同分钟多记录聚合
若df1中同一分钟存在多条记录,可根据业务需求先做聚合,避免后续匹配出现键重复问题:
# 示例为同分钟Count求和,可替换为max/mean等其他聚合逻辑 df1_agg = df1.groupby('date_min', as_index=False)['Count'].sum()
高效更新第二份数据集df2的Count值
以下两种方法均为向量化操作,无循环逻辑,可直接处理万级行数据,运行效率远高于逐行遍历。
方法1:字典映射(速度最优,适合大表场景)
将聚合后的时间-Count对转为字典,直接映射到df2的对应时间行,未匹配的位置保留原有值:
# 生成时间到计数的映射字典 count_map = dict(zip(df1_agg['date_min'], df1_agg['Count'])) # 映射并填充未匹配值,保留原有Count df2['Count'] = df2['date'].map(count_map).fillna(df2['Count']).astype(int)
方法2:左连接合并(适合需保留源数据集其他字段的场景)
通过左连接将匹配值合并到df2,再做值填充:
# 左连接匹配计数 df2 = df2.merge(df1_agg, left_on='date', right_on='date_min', how='left') # 用匹配到的新值替换原有值,未匹配的保留原有0 df2['Count'] = df2['Count_y'].fillna(df2['Count_x']).astype(int) # 清理合并产生的冗余列 df2 = df2.drop(columns=['date_min', 'Count_x', 'Count_y'])
注意事项
- 不要使用字符串格式化时间后再匹配的方案,容易因格式不一致出现匹配失败,直接使用datetime类型做计算可避免该问题。
- 若同分钟存在多条
df1记录,必须先聚合,否则会导致合并后df2行数膨胀、数据错乱。
内容的提问来源于stack exchange,提问作者Adnan Ali
相关产品推荐
相关产品推荐

