如何基于唯一ID对比两个DataFrame的值并计算分钟级时间差?
解决方案:基于ID匹配DataFrame并计算时间差
没问题,我来帮你搞定这个需求!咱们一步步来实现基于唯一ID(ID列)匹配两个DataFrame,计算精确分钟级时间差,同时整理出需要的ST、ST2、ST3列。
步骤1:准备环境与构造示例数据
首先确保你已经安装了pandas,然后我们先把你给出的两个DataFrame用代码构造出来(补全了你未写完的DF_2内容):
import pandas as pd # 构造DF_1 df1 = pd.DataFrame({ 'ID': ['AB-55', 'AB-78', 'AB-48'], 'Date': ['2017-01-04 18:25:14', '2017-01-08 08:48:14', '2017-01-09 21:25:45'], 'Val1': ['adj.f@f', 'arj.t@y', 'edR.u@t'], 'Val2': ['ad2er', 'ar8ey', 'wu5eu'], 'Val3': [25, 258, 75] }) # 构造DF_2(补全缺失的列内容) df2 = pd.DataFrame({ 'ID': ['AB-55', 'AB-78', 'AB-48'], 'Date': ['2017-01-04 18:30:14', '2017-01-08 08:45:14', '2017-01-09 21:30:45'], 'Val1': ['adj.f@f', 'arj.t@y', 'edR.u@t'], 'Val2': ['ad2er', 'ar8ey', 'wu5eu'], 'Val3': [25, 258, 75] })
步骤2:转换时间列为datetime类型
要计算时间差,必须先把Date列转换成pandas的datetime格式:
df1['Date'] = pd.to_datetime(df1['Date']) df2['Date'] = pd.to_datetime(df2['Date'])
步骤3:基于ID合并两个DataFrame
我们通过ID列把两个DataFrame合并,用后缀区分来自不同DF的列:
merged_df = pd.merge(df2, df1, on='ID', suffixes=('_df2', '_df1'))
步骤4:计算精确的分钟级时间差
用两个时间列的差值,转换成总秒数后除以60,得到精确到小数的分钟差:
# 计算DF_2与DF_1的时间差,单位为分钟 merged_df['Dif'] = (merged_df['Date_df2'] - merged_df['Date_df1']).dt.total_seconds() / 60
- 如果需要整数分钟,可以追加
.round(0)或者.astype(int)来取整。 - 注意:如果时间差为负,说明DF_2的时间早于DF_1的时间。
步骤5:整理输出列
把DF_1的Val1、Val2、Val3重命名为ST、ST2、ST3,并筛选出需要的列:
output_df = merged_df.rename(columns={ 'Val1_df1': 'ST', 'Val2_df1': 'ST2', 'Val3_df1': 'ST3' })[['ID', 'Date_df2', 'Val1_df2', 'Val2_df2', 'Val3_df2', 'ST', 'ST2', 'ST3', 'Dif']]
最终输出结果
执行完上述代码后,output_df的内容如下:
| ID | Date_df2 | Val1_df2 | Val2_df2 | Val3_df2 | ST | ST2 | ST3 | Dif |
|---|---|---|---|---|---|---|---|---|
| AB-55 | 2017-01-04 18:30:14 | adj.f@f | ad2er | 25 | adj.f@f | ad2er | 25 | 5.0 |
| AB-78 | 2017-01-08 08:45:14 | arj.t@y | ar8ey | 258 | arj.t@y | ar8ey | 258 | -3.0 |
| AB-48 | 2017-01-09 21:30:45 | edR.u@t | wu5eu | 75 | edR.u@t | wu5eu | 75 | 5.0 |
额外说明
- 如果你的DF_2有更多
Val...列,只需要在重命名时对应添加ValX_df1: 'STX'即可。 - 如果不需要保留DF_2的Val列,可以在筛选输出列时去掉它们。
内容的提问来源于stack exchange,提问作者Roy1245
相关产品推荐
相关产品推荐

