基于Datetime Index合并Pandas DataFrame并按12小时填充列
解决12小时间隔合并与填充的方案
我来帮你搞定这个每12小时维度的合并与填充问题~核心思路是把两个DataFrame的时间都对齐到12小时的时间区间上,完成匹配后再填充间隔值,具体步骤如下:
1. 为两个DataFrame生成统一的12小时区间标识
首先要让df(带DatetimeIndex)和df2(含12小时列)拥有可匹配的时间分组键:
处理df的DatetimeIndex
利用floor('12H')把每个时间点向下取整到最近的12小时节点(0点或12点),生成新的区间列:
# 为df添加12小时区间列 df['12h_interval'] = df.index.floor('12H')
处理df2的12小时列
先确保df2的12小时列是datetime类型,再同样用floor('12H')统一格式:
# 先转换为datetime类型(如果还不是的话) df2['12h_interval'] = pd.to_datetime(df2['你的12小时列名']).floor('12H')
2. 基于12小时区间+short_id合并
和你之前整日期合并的逻辑一致,只是把关联键换成['12h_interval', 'short_id'],推荐用left合并来保留df的所有时间点:
df_merged = pd.merge(df, df2, on=['12h_interval', 'short_id'], how='left')
3. 填充12小时间隔之间的值
合并后,非12小时节点的行会出现NaN,用ffill()(向前填充,用上一个12小时的值覆盖)或bfill()(向后填充)补全,也可以用线性插值实现更平滑的填充:
# 向前填充(常用方案) df_final = df_merged.ffill() # 或者线性插值(适合数值型列) df_final = df_merged.interpolate(method='linear')
举个实际例子
假设df的结构:
short_id value 2024-05-20 01:00:00 A 10 2024-05-20 06:00:00 A 15 2024-05-20 13:00:00 A 20 2024-05-20 18:00:00 A 25
df2的结构:
12h_col short_id 12h_value 2024-05-20 00:00:00 A 100 2024-05-20 12:00:00 A 200
经过上述步骤处理后,最终的df_final会变成:
short_id value 12h_interval 12h_col 12h_value 2024-05-20 01:00:00 A 10 2024-05-20 00:00:00 2024-05-20 00:00:00 100 2024-05-20 06:00:00 A 15 2024-05-20 00:00:00 2024-05-20 00:00:00 100 2024-05-20 13:00:00 A 20 2024-05-20 12:00:00 2024-05-20 12:00:00 200 2024-05-20 18:00:00 A 25 2024-05-20 12:00:00 2024-05-20 12:00:00 200
额外注意点
- 如果df2的12小时列是字符串格式,一定要先通过
pd.to_datetime()转换为datetime类型,否则无法匹配。 - 多组
short_id的场景下,这个方案依然有效,因为合并时会自动按short_id分组匹配对应的12小时区间值。
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

