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

如何在Pandas DataFrame中按周将周一Open值复制到当周其他单元格?

解决方法

你可以通过按周分组的方式,把每周周一的Open值提取出来后自动填充到当周所有行,下面是两种实用的实现方式:

方法一:groupby + transform 直接生成

这种方法一步到位,无需额外中间表:

  1. 先确保日期列是datetime格式(如果还没转换的话):
import pandas as pd
df['date'] = pd.to_datetime(df['date'])
  1. 给每行标记对应ISO标准周数(每年周数范围1-53):
df['week_num'] = df['date'].dt.isocalendar().week
  1. 分组后提取周一的Open值并广播到整周:
df['Expected_Open'] = df.groupby('week_num')['open'].transform(
    lambda x: x[x.index.map(lambda i: df.loc[i, 'Weekday'] == 'Monday')].iloc[0]
)

或者用更易读的自定义函数写法:

def get_weekly_monday_open(group):
    # 从分组中筛选周一的Open值,取第一个(确保每周仅一条周一数据)
    monday_open_val = group[group['Weekday'] == 'Monday']['open'].iloc[0]
    # 返回和分组行数一致的数组,填充该值
    return [monday_open_val] * len(group)

df['Expected_Open'] = df.groupby('week_num').apply(get_weekly_monday_open).explode()

方法二:提取周一数据后合并

这种方式逻辑更直观,适合新手理解:

  1. 同样先处理日期和周数:
df['date'] = pd.to_datetime(df['date'])
df['week_num'] = df['date'].dt.isocalendar().week
  1. 单独提取每周周一的Open值,并重命名目标列:
# 筛选周一的行,仅保留周数和Open列
monday_open_data = df[df['Weekday'] == 'Monday'][['week_num', 'open']].rename(columns={'open': 'Expected_Open'})
  1. 按周数合并原表和周一数据,自动填充整周:
df = df.merge(monday_open_data, on='week_num', how='left')

注意事项

  • 如果数据中存在某周无周一数据的情况,上述方法会生成NaN,你可以根据需求用fillna()处理,比如填充前一周的周一值或其他默认值。
  • 若需按自然年周数统计(而非ISO标准),可将周数生成代码改为df['week_num'] = df['date'].dt.strftime('%W')(%W以周一为一周起始)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:32:14