基于非标准周周期从日度Dataframe生成周度数据的方案
问题描述
我需要将包含Date列的日度Dataframe转换为周度数据,但现有代码默认以周日作为周结束日,无法满足需求——我的数据中的周并非标准的周一至周五/周日,部分周结束于周六、周四或周三,甚至有周从周二/周三开始。
期望输出
- 新Dataframe包含两列:
Date(当周最后日期)和weekday(对应日期的星期名称,如周五/周四) - 计算当周的累计指标:
High的最大值、Low的最小值、当周第一个Open值、当周最后一个Close值 - 方案需高效稳健,能处理60万+条记录
示例Dataframe
| Date | Open | High | Low | Close |
|---|---|---|---|---|
| 1-Apr-2011 | 11800.00 | 11800.00 | 11602.00 | 11677.10 |
| 4-Apr-2011 | 11703.95 | 11919.00 | 11684.00 | 11884.95 |
| ... | ... | ... | ... | ... |
| 30-Apr-2011 | 11588.80 | 11588.80 | 11229.00 | 11284.00 |
尝试过的代码
temp_df['Date'] = pd.to_datetime(temp_df['Date'], format='%d-%b-%Y') # set the date column as the index temp_df.set_index('Date', inplace=True) # resample the data to weekly frequency and aggregate with OHLC method weekly_data = temp_df.resample('W').agg({'High':'max', 'Low':'min', 'Open':'first', 'Close':'last'}).reset_index() weekly_data['Date'] = pd.to_datetime(weekly_data['Date'], format='%Y%m%d') weekly_data['Date'] = weekly_data['Date'].dt.strftime('%d-%b-%Y')
这段代码的OHLC计算逻辑正确,但周结束日默认设为周日,不符合我的自定义周需求。
解决方案
核心思路是先为每条数据分配自定义周的分组标识,再通过向量化分组聚合计算指标,全程避免循环操作,保证60万+条数据的处理效率。
步骤1:预处理数据
首先确保日期列格式正确并排序(日度数据必须排序,否则first/last指标会出错):
import pandas as pd # 转换日期格式 temp_df['Date'] = pd.to_datetime(temp_df['Date'], format='%d-%b-%Y') # 按日期排序(关键步骤,60万条数据排序效率无压力) temp_df = temp_df.sort_values('Date').reset_index(drop=True)
步骤2:生成自定义周分组标识
根据你的周结束日规则,生成分组标识,分两种常见场景:
场景A:周结束日是固定的几个星期几(比如周三、周四、周六)
用dt.weekday判断日期是否为周结束日,再通过cumsum生成连续分组:
# 定义周结束日的weekday值:0=周一,1=周二,2=周三,3=周四,5=周六 week_end_weekdays = [2, 3, 5] temp_df['is_week_end'] = temp_df['Date'].dt.weekday.isin(week_end_weekdays) # 生成分组标识:每遇到一个周结束日,下一条数据进入新组 temp_df['week_group'] = temp_df['is_week_end'].shift(fill_value=False).cumsum()
场景B:周结束日是给定的具体日期列表
如果有提前定义的所有周结束日列表,直接匹配生成分组:
# 假设你有预先整理好的周结束日列表 week_end_dates = pd.to_datetime(['2011-04-06', '2011-04-14', '2011-04-20']) temp_df['is_week_end'] = temp_df['Date'].isin(week_end_dates) # 同样生成分组标识 temp_df['week_group'] = temp_df['is_week_end'].shift(fill_value=False).cumsum()
步骤3:分组聚合计算周度指标
用groupby进行向量化聚合,效率远高于循环,完全适配60万+条数据:
weekly_data = temp_df.groupby('week_group').agg( # 当周最后日期 Date=('Date', 'last'), # 最后日期的星期名称(如Friday/Thursday) weekday=('Date', lambda x: x.dt.day_name().iloc[-1]), # 周度High最大值 High=('High', 'max'), # 周度Low最小值 Low=('Low', 'min'), # 周内第一个Open值 Open=('Open', 'first'), # 周内最后一个Close值 Close=('Close', 'last') ).reset_index(drop=True) # 可选:将Date格式转回你需要的字符串格式 weekly_data['Date'] = weekly_data['Date'].dt.strftime('%d-%b-%Y')
方案优势
- 高效稳健:全程向量化操作,pandas的
groupby和agg针对大数据量做了优化,60万条数据处理速度快; - 灵活适配:支持任意自定义周结束规则,不管是固定星期几还是指定具体日期;
- 结果准确:排序后再分组,保证
first/last指标对应周内的真实首尾值。
内容的提问来源于stack exchange,提问作者vineet singh
相关产品推荐
相关产品推荐

