如何高效合并两个Pandas DataFrame中时间戳匹配的数据?
Pandas按匹配时间戳合并两个长度不同的DataFrame
这在时间序列数据处理里太常见了!我来给你说两种最高效的实现方式,完全匹配你的需求:
一、得到包含所有匹配时间戳的合并DataFrame
最直接的方式是用Pandas的merge函数做内连接(inner join),它会自动只保留两个DataFrame中都存在的时间戳,把对应的数据合并到一起。
步骤说明:
- 先确保你的时间戳列是
datetime类型(避免字符串格式不统一导致匹配失败) - 用
merge指定匹配的时间戳列,选择how='inner'只保留交集数据
代码示例:
假设你的第二个DataFrame叫dataOther,时间戳列是TimestampOther(如果两个DataFrame的时间戳列名相同,比如都叫Timestamp,直接用on='Timestamp'更简单):
import pandas as pd # 读取数据(你的原有代码) fileREF = 'FilterDataREF.xlsx' dataREF = pd.read_excel(fileREF, sheet_name='Sheet1') # 假设第二个文件读取方式类似 fileOther = 'FilterDataOther.xlsx' dataOther = pd.read_excel(fileOther, sheet_name='Sheet1') # 转换时间戳列为datetime类型 dataREF['TimestampREF'] = pd.to_datetime(dataREF['TimestampREF']) dataOther['TimestampOther'] = pd.to_datetime(dataOther['TimestampOther']) # 内连接合并,只保留双方都有的时间戳 merged_df = pd.merge( dataREF, dataOther, left_on='TimestampREF', right_on='TimestampOther', how='inner' )
如果数据量很大,把时间戳设为索引后用join会更快(索引查找效率更高):
# 设置时间戳为索引 dataREF = dataREF.set_index('TimestampREF') dataOther = dataOther.set_index('TimestampOther') # 内连接合并 merged_df = dataREF.join(dataOther, how='inner')
二、得到两个长度一致的匹配时间戳DataFrame
如果你不想合并成一个表,而是要分别从两个原DataFrame中筛选出对方存在的时间戳,用isin方法或者索引交集都很高效:
方法1:用isin筛选
# 从dataREF中筛选出dataOther有的时间戳 filtered_ref = dataREF[dataREF['TimestampREF'].isin(dataOther['TimestampOther'])] # 从dataOther中筛选出dataREF有的时间戳 filtered_other = dataOther[dataOther['TimestampOther'].isin(dataREF['TimestampREF'])]
方法2:用索引交集(大数据集更高效)
# 先设置时间戳为索引 dataREF = dataREF.set_index('TimestampREF') dataOther = dataOther.set_index('TimestampOther') # 获取双方共有的时间戳 common_timestamps = dataREF.index.intersection(dataOther.index) # 筛选出匹配的数据 filtered_ref = dataREF.loc[common_timestamps] filtered_other = dataOther.loc[common_timestamps]
注意点:
- 一定要先把时间戳转换成
datetime类型,否则字符串匹配可能因为格式(比如时区、毫秒数)导致漏匹配 - 大数据集优先用索引操作,比
isin的线性扫描速度快很多
内容的提问来源于stack exchange,提问作者Nicklas Koldkjær
相关产品推荐
相关产品推荐

