You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一Pandas DataFrame按时段匹配替换数据值

解决方案

要实现按一天中的时段匹配替换y值,核心是提取第一个DataFrame(下称df1)中时间的时分秒部分,和第二个DataFrame(下称df2)的索引做匹配,再替换对应值。下面是几种实用方法:

方法1:字符串格式匹配(简单直接)

通过提取时分秒字符串作为匹配键,用map快速替换:

# 从df1的timestamp列提取时分秒字符串(如"00:00:00")
df1['time_str'] = df1['timestamp'].dt.strftime('%H:%M:%S')

# 用df2的y值替换df1的y值——仅替换能匹配到的时段,未匹配的会变成NaN
# 如果想保留未匹配的原y值,加上.fillna(df1['y'])
df1['y'] = df1['time_str'].map(df2['y'])  # 或 df1['y'] = df1['time_str'].map(df2['y']).fillna(df1['y'])

# 清理临时列
df1.drop('time_str', axis=1, inplace=True)

方法2:时间对象匹配(精准无格式问题)

用datetime.time对象匹配,避免字符串格式不一致的问题:

# 提取df1 timestamp的时间部分(得到datetime.time类型,如00:00:00)
df1['time_obj'] = df1['timestamp'].dt.time

# 构建df2的时间-值映射字典
time_to_y = {idx.time(): val for idx, val in df2['y'].items()}

# 替换y值,同样可加.fillna(df1['y'])保留原数值
df1['y'] = df1['time_obj'].map(time_to_y)

# 删除临时列
df1.drop('time_obj', axis=1, inplace=True)

方法3:Merge合并(直观易理解)

用合并的方式做匹配替换,适合需要查看匹配情况的场景:

# 给df1添加时分秒列
df1['time'] = df1['timestamp'].dt.strftime('%H:%M:%S')
# 把df2的索引转为普通列,方便合并
df2_flat = df2.reset_index().rename(columns={'timestamp': 'time'})

# 按time列合并,替换y值
df1 = df1.merge(df2_flat, on='time', how='left')
# 用df2的y值覆盖原y值,未匹配的保留原数值
df1['y'] = df1['y_y'].fillna(df1['y_x'])
# 清理多余列
df1 = df1.drop(['y_x', 'y_y', 'time'], axis=1)

注意事项

  • 确保df2的索引时段格式和df1提取的时间格式完全一致(比如都是%H:%M:%S,没有多余的日期信息)
  • 如果只想替换存在匹配的行,保留未匹配行的原y值,一定要加上.fillna(df1['y'])

内容的提问来源于stack exchange,提问作者Luca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:06:40