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

如何使每日pandas DataFrame获取与重采样后周度DataFrame相同的数值

如何让日度Pandas DataFrame匹配重采样后的周度数据?

嘿,我来帮你搞定这个问题——你想要让日度价格DataFrame的每一行,都对应上它所在周的周度重采样数值对吧?其实用Pandas的分组变换或者合并操作就能轻松实现,下面是具体的步骤和示例代码:

首先先把你的示例DataFrame用代码还原出来(方便后续操作):

import pandas as pd

# 构建你提供的日度数据
data = {
    'open': [44.66, 43.56, 43.15, 42.40, 42.50, 43.46, 43.75, 41.60, 42.05, 41.98, 41.87],
    'high': [44.75, 43.74, 43.43, 42.70, 43.50, 43.46, 43.75, 42.01, 43.21, 42.48, 42.69],
    'low': [43.56, 42.19, 42.45, 41.19, 41.77, 41.94, 40.60, 40.03, 41.67, 41.63, 41.70],
    'close': [43.56, 42.93, 42.66, 42.25, 43.26, 43.00, 41.02, 41.90, 41.90, 41.96, 41.80],
    'volume': [1000, 2500, 2000, 1500, 200, 5000, 500, 125, 1000, 1200, 800]
}
# 生成对应日期
dates = pd.DatetimeIndex(['2017-11-01', '2017-11-03', '2017-11-06', '2017-11-07', 
                          '2017-11-08', '2017-11-09', '2017-11-10', '2017-11-13', 
                          '2017-11-14', '2017-11-16', '2017-11-17'])
df = pd.DataFrame(data, index=dates)

方法一:用transform直接生成周度统计列(最简洁)

这种方法会直接在原日度DataFrame上新增列,每个交易日都会带上它所在周的周度聚合值,和单独重采样得到的周度DataFrame数值完全一致:

# 按周分组,计算对应的周度OHLCV
df['week_open'] = df['open'].groupby(pd.Grouper(freq='W')).transform('first')  # 每周第一个交易日的开盘价
df['week_high'] = df['high'].groupby(pd.Grouper(freq='W')).transform('max')    # 每周最高价
df['week_low'] = df['low'].groupby(pd.Grouper(freq='W')).transform('min')     # 每周最低价
df['week_close'] = df['close'].groupby(pd.Grouper(freq='W')).transform('last')# 每周最后一个交易日的收盘价
df['week_volume'] = df['volume'].groupby(pd.Grouper(freq='W')).transform('sum')# 每周成交量总和

执行后,你可以查看任意一行的week_*列,它就是该行所在周的周度重采样结果。

方法二:先生成周度DataFrame,再合并回日度数据

如果你需要先单独处理周度数据,再把结果映射回日度,这种方法更灵活:

# 第一步:生成周度重采样DataFrame,用股票数据标准的聚合规则
weekly_df = df.resample('W').agg({
    'open': 'first',
    'high': 'max',
    'low': 'min',
    'close': 'last',
    'volume': 'sum'
})
# 给周度列重命名,避免和日度列冲突
weekly_df = weekly_df.rename(columns={col: f'week_{col}' for col in weekly_df.columns})

# 第二步:把周度数据合并到日度DataFrame,按周对齐
# 把日度索引和周度索引都转成周周期,用于匹配
df['week_period'] = df.index.to_period('W')
weekly_df['week_period'] = weekly_df.index.to_period('W')

# 合并数据
df = df.merge(weekly_df, on='week_period', how='left').drop('week_period', axis=1)

重要注意点:调整周的起始日期

Pandas默认的周是周日结束,如果你需要以周一作为一周的开始(比如美股常用的周度统计),只需要把freq参数改成'W-MON'即可,比如:

# 方法一的调整
df['week_open'] = df['open'].groupby(pd.Grouper(freq='W-MON')).transform('first')

# 方法二的调整
weekly_df = df.resample('W-MON').agg(...)

这样处理后,你的日度DataFrame就会包含和重采样周度DataFrame完全一致的数值啦!

内容的提问来源于stack exchange,提问作者php-junkie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:44:23