Pandas Python3时间序列重采样问题:日频转周频获取真实开盘价
解决日频转周频获取每周首个交易日开盘价的问题
我太懂这种挫败感了——本来想把日度行情数据转成周度,要的是每周第一个交易日的真实开盘价,结果用mean()算出一堆平均数值完全不是想要的,还碰到看不懂的报错,查文档也没找到关键点对吧?别担心,这就给你把问题拆解清楚,一步一步解决。
核心问题:为什么mean()不对?
你用df.resample('W').mean()得到的是整周每日开盘价的算术平均值,这显然不是你要的“每周第一个交易日的开盘价”——我们需要的是取每组(每周)的第一个值,而不是求平均。
正确的实现步骤
1. 确保你的数据索引是DatetimeIndex
这是resample能正常工作的前提,如果你的日期是普通列,先转成时间索引:
import pandas as pd # 假设你的日期列名为'date' df['date'] = pd.to_datetime(df['date']) df.set_index('date', inplace=True)
如果这一步没做,resample大概率会报错(比如提示无法识别时间维度),这可能就是你碰到报错的原因之一。
2. 用resample结合first()获取首个交易日开盘价
直接对open列使用first()聚合函数,就能拿到每周第一个交易日的真实开盘价。如果需要同时处理其他行情列(比如收盘价、高低价),可以用agg()指定每列的聚合规则:
# 按周重采样,默认每周日为周结束日;如果要周一作为周开始,用'W-MON' weekly_data = df.resample('W').agg({ 'open': 'first', # 每周首个交易日开盘价 'close': 'last', # 每周最后一个交易日收盘价 'high': 'max', # 全周最高价 'low': 'min' # 全周最低价 })
3. 调整周的起始/结束日(可选)
默认'W'是以周日作为一周的最后一天,如果你想让周一作为一周的开始,把规则改成'W-MON'即可,同理还有'W-TUE'等,对应不同的周起始日。
常见报错排查
- 如果提示
TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex:说明你的索引不是时间类型,回到步骤1先把日期列转成DatetimeIndex。 - 如果得到的周数据有缺失:检查原始日数据是否有缺失的交易日,或者用
df.dropna(subset=['open'])先清理缺失值,再重采样。
举个直观的例子:
原始日数据:
| date | open | close |
|---|---|---|
| 2024-01-01 | 100 | 105 |
| 2024-01-02 | 106 | 108 |
| 2024-01-03 | 107 | 110 |
| 2024-01-08 | 109 | 112 |
转周频('W')后,第一周(到1月7日)的open是100,第二周(到1月14日)的open是109,完全符合你的需求。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

