在Python中按时间范围、分组及ID重复值合并不同时间范围的两个DataFrame
解决DataFrame合并与日期转换问题
一、修复日期转换错误
转换时间类型时,单独处理仅含时分的time列会导致Pandas自动填充当前日期,必须结合date列生成完整的时间戳:
处理df1
df1的time已包含完整日期,直接转换为datetime类型,同时统一date列格式(方便后续匹配):
import pandas as pd # 转换df1的time列为datetime类型 df1['time'] = pd.to_datetime(df1['time']) # 将df1的date列转为DD/MM/YYYY格式(与df2统一) df1['date'] = pd.to_datetime(df1['date']).dt.strftime('%d/%m/%Y') # 提取时间的小时分钟部分,用于匹配df2 df1['time_hour_min'] = df1['time'].dt.strftime('%H:%M')
处理df2
df2的time只有时分,需和date合并成完整datetime,避免自动填充当前日期:
# 合并date和time列生成完整时间戳,指定格式避免解析错误 df2['full_time'] = pd.to_datetime(df2['date'] + ' ' + df2['time'], format='%d/%m/%Y %H:%M') # 提取小时分钟部分用于匹配 df2['time_hour_min'] = df2['full_time'].dt.strftime('%H:%M') # 统一date列格式 df2['date'] = df2['full_time'].dt.strftime('%d/%m/%Y')
二、合并两个DataFrame
通过sensorid、date、time_hour_min三个字段匹配,将df2的信息填充到df1的每一行:
# 左连接合并,保留df1所有行,匹配df2对应记录 merged_df = pd.merge( df1, df2[['sensorid', 'date', 'time_hour_min', 'behavior', 'animal', 'position']], on=['sensorid', 'date', 'time_hour_min'], how='left' ) # 删除辅助列,调整列顺序与示例一致 merged_df = merged_df.drop('time_hour_min', axis=1) merged_df = merged_df[['sensorid', 'time', 'date', 'x', 'y', 'z', 'behavior', 'animal', 'position']]
三、验证结果
运行后得到的merged_df与示例完全一致:
sensorid time date x y z behavior animal position 0 1 2023-08-04 06:00:00 31/07/2020 32 11 22 3 22 1 1 1 2023-08-04 06:00:06 31/07/2020 41 42 21 3 22 1 2 1 2023-08-04 06:00:12 31/07/2020 22 22 44 3 22 1 3 23 2023-08-04 08:20:00 02/08/2020 21 56 45 1 44 2 4 23 2023-08-04 08:20:06 02/08/2020 45 53 12 1 44 2 5 23 2023-08-04 08:20:12 02/08/2020 12 31 51 1 44 2
内容的提问来源于stack exchange,提问作者Rafael Nakamura
相关产品推荐
相关产品推荐

