如何基于最近前置日期的per_day值生成布尔列?(日期间隔不固定)
基于最近前置日期的per_day值生成布尔标记解决方案
原始数据集
,clock_now,competition,market_name,lay,per_day 0,2022-12-30,A,B,-1.0,-1.0 1,2022-12-31,A,B,1.28,0.28 2,2023-01-01,A,B,-1.0,-0.72 3,2023-01-02,A,B,1.0,0.28 4,2023-01-03,A,B,1.0,1.28 5,2023-01-04,A,B,-1.0,-1.72 6,2023-01-04,A,B,-1.0,-1.72 7,2023-01-04,A,B,-1.0,-1.72
需求说明
- 为每一行数据找到离当前行日期最近的前置日期对应的
per_day值 - 若该值大于0,标记为
True;否则标记为False - 示例:2023-01-04的行需取2023-01-03的
per_day值(1.28),因此标记为True - 预期输出布尔列表:
False False True False True True True True
原代码问题分析
- 逻辑错误:
df.loc[df.clock_now == df['clock_now'] - timedelta(days=1),'per_day'].values[0]无法逐行匹配最近前置日期,只会取第一个匹配值,导致所有结果为False - 场景缺失:未考虑前置日期间隔大于1天、同一日期有多行数据的情况
解决方案代码
import pandas as pd import numpy as np # 加载数据集(若已从文件读取可替换此部分) data = [ [0, "2022-12-30", "A", "B", -1.0, -1.0], [1, "2022-12-31", "A", "B", 1.28, 0.28], [2, "2023-01-01", "A", "B", -1.0, -0.72], [3, "2023-01-02", "A", "B", 1.0, 0.28], [4, "2023-01-03", "A", "B", 1.0, 1.28], [5, "2023-01-04", "A", "B", -1.0, -1.72], [6, "2023-01-04", "A", "B", -1.0, -1.72], [7, "2023-01-04", "A", "B", -1.0, -1.72] ] df = pd.DataFrame(data, columns=["", "clock_now", "competition", "market_name", "lay", "per_day"]) # 转换日期类型并按日期排序 df["clock_now"] = pd.to_datetime(df["clock_now"]) df = df.sort_values("clock_now").reset_index(drop=True) # 构建日期到最近前置日期per_day值的映射 unique_dates = df["clock_now"].unique() date_per_day_map = {} # 处理第一个日期(无前置,用自身per_day) first_per_day = df[df["clock_now"] == unique_dates[0]]["per_day"].iloc[0] date_per_day_map[unique_dates[0]] = first_per_day # 遍历后续日期,匹配最近前置日期的per_day for i in range(1, len(unique_dates)): current_date = unique_dates[i] prev_date = unique_dates[i-1] prev_per_day = df[df["clock_now"] == prev_date]["per_day"].iloc[0] date_per_day_map[current_date] = prev_per_day # 生成布尔标记列 df["invest"] = df["clock_now"].map(date_per_day_map) > 0 # 输出结果 print(df["invest"].tolist())
代码优势
- 自动处理同一日期多行数据的场景,同一日期的行共用同一个前置日期的
per_day值 - 支持前置日期间隔大于1天的情况,仅需确保日期按顺序排列
- 第一行无前置日期时,用自身
per_day值匹配预期结果
输出结果与预期完全一致:[False, False, True, False, True, True, True, True]
内容的提问来源于stack exchange,提问作者Digital Farmer
相关产品推荐
相关产品推荐

