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

基于日度DataFrame生成含上周及本周累计高低值的新DataFrame

问题描述

我有一个包含日度数据的DataFrame df1,数据结构如下:

日期星期最高值最低值
2016年1月1日星期五17144.8516823
2016年1月4日星期一1700016603
2016年1月5日星期二1670016516.65
2016年1月6日星期三16659.316376
2016年1月7日星期四16344.416058
2016年1月8日星期五1626416126.05
2016年1月11日星期一1618615841.4
2016年1月12日星期二16125.315723.3
2016年1月13日星期三1597415536
2016年1月14日星期四15808.715455
2016年1月15日星期五1563915161.5
2016年1月18日星期一1534714985.35
2016年1月19日星期二1534815083.65
2016年1月20日星期三1506014730
2016年1月21日星期四1536014901
2016年1月22日星期五15607.815261
2016年1月25日星期一15681.315460
2016年1月27日星期三15629.215412.65
2016年1月28日星期四15564.915355
2016年1月29日星期五1557815171.6

需要基于df1创建新的DataFrame,包含以下字段:

  • PWH:对应日期所在周的上一周的最高值列最大值;无上一周则标记为-
  • PWL:对应日期所在周的上一周的最低值列最小值;无上一周则标记为-
  • CWH:本周从周一到当前日期的最高值列最大值;每周第一个工作日(周一)标记为-
  • CWL:本周从周一到当前日期的最低值列最小值;每周第一个工作日(周一)标记为-

规则示例

  • 1月4日-8日所在周的上一周仅包含1月1日,因此该周所有日期的PWH为17144.85,PWL为16823
  • 1月5日的CWH为1月4日-5日的最高值最大值17000,CWL为同期最低值最小值16603

预期输出

日期PWHPWLCWHCWL
2016年1月1日----
2016年1月4日17144.8516823--
2016年1月5日17144.85168231700016603
2016年1月6日17144.85168231700016516.65
2016年1月7日17144.85168231700016376
2016年1月8日17144.85168231700016058
2016年1月11日1700016058--
2016年1月12日17000160581618615841.4
2016年1月13日17000160581618615723.3
2016年1月14日17000160581618615536
2016年1月15日17000160581618615455
2016年1月18日1618615161.5--
2016年1月19日1618615161.51534714985.35
2016年1月20日1618615161.51534814985.35
2016年1月21日1618615161.51534814730
2016年1月22日1618615161.51536014730
2016年1月25日15607.814730--
2016年1月27日15607.81473015681.315460
2016年1月28日15607.81473015681.315412.65
2016年1月29日15607.81473015681.315355

我尝试了以下代码,但无法得到符合要求的输出:

temp_wk = daily_df.copy()
temp_wk.set_index(pd.to_datetime(temp_wk['Date']), inplace=True)

weekly_high = temp_wk['Low'].resample('W').min()

prev_week_high = weekly_high.shift(1)

print(prev_week_high)
解决方案

要实现需求,需要分步骤处理周分组、上周统计值映射、本周累计统计三个核心环节,具体代码如下:

步骤1:数据预处理

首先将日期列转换为datetime类型,方便后续按周分组:

import pandas as pd

# 假设df1是原始数据
df1['日期'] = pd.to_datetime(df1['日期'])

步骤2:计算每周的最高/最低值并映射到上周

使用resample按周(周一为周起始)统计每周的最高值最大值和最低值最小值,然后将上周的统计结果映射到当前周的所有日期:

# 按周(W-MON表示周一为周起始)统计每周的最高值max和最低值min
weekly_stats = df1.resample('W-MON', on='日期').agg(
    weekly_high=('最高值', 'max'),
    weekly_low=('最低值', 'min')
)

# 生成上周的统计数据,shift(1)获取上一周的结果
weekly_stats['prev_week_high'] = weekly_stats['weekly_high'].shift(1)
weekly_stats['prev_week_low'] = weekly_stats['weekly_low'].shift(1)

# 将周统计数据合并回原始df,通过周期匹配关联当前周的所有日期
df1 = df1.merge(
    weekly_stats[['prev_week_high', 'prev_week_low']],
    left_on=df1['日期'].dt.to_period('W-MON'),
    right_index=True,
    how='left'
)

# 替换空值为'-',匹配需求中的无数据标记
df1['PWH'] = df1['prev_week_high'].fillna('-')
df1['PWL'] = df1['prev_week_low'].fillna('-')

步骤3:计算本周累计最高/最低值

按周分组后,使用expanding计算从本周一开始到当前日期的累计最大值和最小值,然后将周一的结果替换为'-':

# 按周分组,计算本周累计的最高值max和最低值min
df1['CWH'] = df1.groupby(df1['日期'].dt.to_period('W-MON'))['最高值'].expanding().max().reset_index(level=0, drop=True)
df1['CWL'] = df1.groupby(df1['日期'].dt.to_period('W-MON'))['最低值'].expanding().min().reset_index(level=0, drop=True)

# 将每周的第一个工作日(周一)的CWH、CWL替换为'-'
df1.loc[df1['星期'] == '星期一', ['CWH', 'CWL']] = '-'

步骤4:整理最终输出

保留需要的列并调整顺序,同时将日期转换为预期的格式:

result_df = df1[['日期', 'PWH', 'PWL', 'CWH', 'CWL']].copy()
# 将日期转换为"YYYY年MM月DD日"格式
result_df['日期'] = result_df['日期'].dt.strftime('%Y年%m月%d日')

print(result_df)

代码说明

  • 使用W-MON作为周频率,确保每周从周一开始,完全匹配需求中的周定义;
  • resample统计每周极值,通过shift(1)获取上周数据,再通过周期匹配合并到原始数据,保证当前周所有日期都能关联到上周统计值;
  • expanding实现本周累计统计,结合星期判断替换周一的累计值为'-',符合规则要求;
  • 最终处理日期格式,与预期输出样式完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:07:01