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

如何基于现有Pandas DataFrame的日期条件筛选求和生成新DataFrame

实现步骤与代码

首先需确保所有日期列已转换为datetime类型,再按以下步骤实现需求:

步骤1:生成结果表基础结构

提取原表Sched Week列的去重值,排序后作为结果表的基准列:

import pandas as pd

# 转换日期列格式(若你的数据已完成格式转换可跳过该步)
df["Sched Week"] = pd.to_datetime(df["Sched Week"])
df["Ship Week"] = pd.to_datetime(df["Ship Week"])
df["Ready Week"] = pd.to_datetime(df["Ready Week"])

# 生成结果表基础结构
df_result = pd.DataFrame({
    "Sched Week": df["Sched Week"].unique()
}).sort_values("Sched Week", ignore_index=True)

步骤2:按条件求和计算foo列

两种实现方案可按需选择:

  • 方案1:逻辑直观,适合数据量小于10万的场景
def sum_matched_vals(current_sched):
    match_mask = (
        (df["Sched Week"] <= current_sched) &
        (df["Ship Week"] > current_sched) &
        (df["Ready Week"] <= current_sched)
    )
    return df.loc[match_mask, "vals"].sum()

df_result["foo"] = df_result["Sched Week"].apply(sum_matched_vals)
  • 方案2:广播运算,速度更快,适合百万级以上大表
import numpy as np

# 提取数组做广播匹配
sched_col = df["Sched Week"].values[:, None]
ship_col = df["Ship Week"].values[:, None]
ready_col = df["Ready Week"].values[:, None]
target_scheds = df_result["Sched Week"].values[None, :]
vals_col = df["vals"].values[:, None]

# 批量匹配后求和
match_mask = (sched_col <= target_scheds) & (ship_col > target_scheds) & (ready_col <= target_scheds)
df_result["foo"] = (vals_col * match_mask).sum(axis=0)

用你提供的示例数据运行后,输出结果与描述逻辑完全匹配,第一个2021-01-04对应的foo值为20,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:27:05