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

如何遍历DataFrame按日期取当日首开盘价计算每日变化值?

问题解决:计算5分钟行情数据的每日相对变化

原代码错误原因

你遇到的“truth value is ambiguous”错误,是因为if price_df.index.date == temp_df.index.date这行代码在比较两个日期序列,返回的是布尔数组而非单个布尔值,pandas无法直接判断这个数组的真假,所以抛出该错误。此外,循环中修改temp_df不会同步到原DataFrame,因为temp_df是切片生成的副本,最终原数据不会新增目标列。

最优解决方案

利用pandas的分组(groupby)和广播(transform)功能,无需循环即可高效处理多日数据,自动适配日期切换:

import pandas as pd
import datetime

# 确保Datetime列是索引且为datetime类型(若未处理)
# data['Datetime'] = pd.to_datetime(data['Datetime'])
# data.set_index('Datetime', inplace=True)

# 定义函数:获取当日9:30的开盘价,无数据则返回空值
def get_daily_open(group):
    daily_open_row = group[group.index.time == datetime.time(9, 30)]['Open']
    return daily_open_row.iloc[0] if not daily_open_row.empty else pd.NA

# 按日期分组,将每日开盘价广播到组内所有行
daily_open = data.groupby(data.index.date)['Open'].transform(get_daily_open)

# 计算Daily Change:当日9:30开盘价 / 当前区间开盘价 - 1
data['Daily Change'] = daily_open / data['Open'] - 1

代码说明

  1. 分组广播:通过groupby(data.index.date)按自然日分组,transform会把每组的9:30开盘价复制到该组的所有行,实现日期自动切换。
  2. 异常处理:如果某天没有9:30的行情数据,会返回pd.NA,避免报错。
  3. 效率优势:相比循环,pandas原生分组操作处理大规模数据时速度更快,代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:56:13