基于日度DataFrame生成含上周及本周累计高低值的新DataFrame
问题描述
我有一个包含日度数据的DataFrame df1,数据结构如下:
| 日期 | 星期 | 最高值 | 最低值 |
|---|---|---|---|
| 2016年1月1日 | 星期五 | 17144.85 | 16823 |
| 2016年1月4日 | 星期一 | 17000 | 16603 |
| 2016年1月5日 | 星期二 | 16700 | 16516.65 |
| 2016年1月6日 | 星期三 | 16659.3 | 16376 |
| 2016年1月7日 | 星期四 | 16344.4 | 16058 |
| 2016年1月8日 | 星期五 | 16264 | 16126.05 |
| 2016年1月11日 | 星期一 | 16186 | 15841.4 |
| 2016年1月12日 | 星期二 | 16125.3 | 15723.3 |
| 2016年1月13日 | 星期三 | 15974 | 15536 |
| 2016年1月14日 | 星期四 | 15808.7 | 15455 |
| 2016年1月15日 | 星期五 | 15639 | 15161.5 |
| 2016年1月18日 | 星期一 | 15347 | 14985.35 |
| 2016年1月19日 | 星期二 | 15348 | 15083.65 |
| 2016年1月20日 | 星期三 | 15060 | 14730 |
| 2016年1月21日 | 星期四 | 15360 | 14901 |
| 2016年1月22日 | 星期五 | 15607.8 | 15261 |
| 2016年1月25日 | 星期一 | 15681.3 | 15460 |
| 2016年1月27日 | 星期三 | 15629.2 | 15412.65 |
| 2016年1月28日 | 星期四 | 15564.9 | 15355 |
| 2016年1月29日 | 星期五 | 15578 | 15171.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
预期输出
| 日期 | PWH | PWL | CWH | CWL |
|---|---|---|---|---|
| 2016年1月1日 | - | - | - | - |
| 2016年1月4日 | 17144.85 | 16823 | - | - |
| 2016年1月5日 | 17144.85 | 16823 | 17000 | 16603 |
| 2016年1月6日 | 17144.85 | 16823 | 17000 | 16516.65 |
| 2016年1月7日 | 17144.85 | 16823 | 17000 | 16376 |
| 2016年1月8日 | 17144.85 | 16823 | 17000 | 16058 |
| 2016年1月11日 | 17000 | 16058 | - | - |
| 2016年1月12日 | 17000 | 16058 | 16186 | 15841.4 |
| 2016年1月13日 | 17000 | 16058 | 16186 | 15723.3 |
| 2016年1月14日 | 17000 | 16058 | 16186 | 15536 |
| 2016年1月15日 | 17000 | 16058 | 16186 | 15455 |
| 2016年1月18日 | 16186 | 15161.5 | - | - |
| 2016年1月19日 | 16186 | 15161.5 | 15347 | 14985.35 |
| 2016年1月20日 | 16186 | 15161.5 | 15348 | 14985.35 |
| 2016年1月21日 | 16186 | 15161.5 | 15348 | 14730 |
| 2016年1月22日 | 16186 | 15161.5 | 15360 | 14730 |
| 2016年1月25日 | 15607.8 | 14730 | - | - |
| 2016年1月27日 | 15607.8 | 14730 | 15681.3 | 15460 |
| 2016年1月28日 | 15607.8 | 14730 | 15681.3 | 15412.65 |
| 2016年1月29日 | 15607.8 | 14730 | 15681.3 | 15355 |
我尝试了以下代码,但无法得到符合要求的输出:
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
相关产品推荐
相关产品推荐

