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

如何用Pandas实现基于前一日期组指定值的列填充?

问题描述

现有带日期时间索引的Pandas DataFrame(仅含a列),需生成目标列b,规则如下:

  • b取值为前一个存在10:00时间点的日期中,a列在10:00对应的值;
  • 若前一个可用日期无10:00数据,则b为NaN。

要求避免迭代分组的方式,使用Pandas原生惯用方法实现。

解决方案

步骤1:提取所有10:00时间点的a值

先筛选出所有小时为10的行,提取对应a值并按日期整理:

import pandas as pd
import numpy as np

# 原数据构造(用户提供)
df = pd.DataFrame(
  [ dict(a=75, b=np.nan, d='2023-01-01 00:00')
  , dict(a=82, b=np.nan, d='2023-01-01 10:00')
  , dict(a=39, b=np.nan, d='2023-01-01 20:00')
  , dict(a=10, b=82       , d='2023-01-05 00:00')
  , dict(a=90, b=82       , d='2023-01-05 20:00')
  , dict(a=61, b=np.nan, d='2023-02-08 00:00')
  , dict(a=35, b=np.nan, d='2023-02-08 10:00')
  , dict(a=95, b=np.nan, d='2023-02-08 20:00')
  , dict(a=21, b=35       , d='2023-04-15 00:00')
  , dict(a=60, b=35       , d='2023-04-15 10:00')
  ])                                             
df['d'] = pd.to_datetime(df['d'])            
df = df.set_index('d')

# 提取所有10:00的a值,按日期索引
daily_10am = df[df.index.hour == 10]['a'].reset_index()
daily_10am['date'] = daily_10am['d'].dt.date
daily_10am = daily_10am.set_index('date')['a']

步骤2:使用merge_asof匹配前一个有效日期的值

merge_asof是Pandas处理有序序列向前/向后匹配的核心工具,适合这类时间序列的前值查找场景:

# 给原数据添加日期列(转为datetime类型,方便匹配)
df['date_dt'] = pd.to_datetime(df.index.date)

# 将提取的10:00数据转为可匹配的格式
daily_10am_df = daily_10am.reset_index().rename(columns={'a': 'b'})
daily_10am_df['date'] = pd.to_datetime(daily_10am_df['date'])

# 按日期向前匹配最近的、早于当前日期的10:00数据
result = pd.merge_asof(
    df.sort_values('date_dt'),
    daily_10am_df.sort_values('date'),
    left_on='date_dt',
    right_on='date',
    direction='backward'  # 找小于等于当前日期的最近值
)

# 恢复原索引并清理临时列
result = result.set_index(df.index).sort_index()
df['b'] = result['b']
df = df.drop(columns=['date_dt'])

print(df)

执行后输出与目标结果完全一致:

a     b
d
2023-01-01 00:00:00  75   NaN
2023-01-01 10:00:00  82   NaN
2023-01-01 20:00:00  39   NaN
2023-01-05 00:00:00  10  82.0
2023-01-05 20:00:00  90  82.0
2023-02-08 00:00:00  61   NaN
2023-02-08 10:00:00  35   NaN
2023-02-08 20:00:00  95   NaN
2023-04-15 00:00:00  21  35.0
2023-04-15 10:00:00  60  35.0
通用场景处理思路

针对“从前一组查找值”这类需求,优先使用Pandas的向量化操作,避免手动迭代:

  • 有序序列(如时间序列):用merge_asof高效实现向前/向后匹配,支持按指定键找最近的符合条件的值;
  • 分组特征提取:先提取每个分组的关键特征(如本例中每个日期的10:00值),再通过merge或map结合排序完成匹配;
  • 避免循环迭代分组,Pandas的内置向量化操作性能远高于手动循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:45:08