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

如何在Pandas DataFrame中按日查找特定时间窗口内的最大值

按日统计指定时间段内的最高值(无循环Pandas方案)

问题描述

我有一个包含多日5分钟间隔数据的Pandas DataFrame,需要找出每日09:30-09:55时间段内的最高值。原代码只能获取该时间窗口内所有日期的整体最大值,无法按日统计;尝试手动生成交易日列表循环处理虽然可行,但代码复杂易出错,希望得到更简便的无循环解决方案。

原代码(仅能获取整体最大值)

import pandas as pd
import yfinance as yf

# 获取数据
data = yf.download(tickers="MSFT", period="5d", interval="5m")

df = pd.DataFrame(data)
df = df.between_time('9:30', '09:55')
x = df.High.idxmax(axis=0)

print(x, df.High[x])

尝试的循环方案(复杂易出错)

from datetime import date, timedelta, datetime

# 生成交易日列表(周一至周五)
start_date = date(2024, 3, 11)
end_date = date(2024, 3, 16)
ONE_DAY = timedelta(days=1)
monToFri = set([0,1,2,3,4])

def gen_trading_days(start, end):
    thisDay = start
    while thisDay < end:
        dow = thisDay.weekday()
        while dow not in monToFri:
            thisDay += ONE_DAY
            dow = thisDay.weekday()
        yield thisDay
        thisDay += ONE_DAY

trading_days = []        
for i in gen_trading_days(start_date, end_date):
    trading_days.append(str(i))

# 循环遍历交易日,筛选时间窗口并找最大值
for i in range(len(trading_days)):
    startDate = trading_days[i]
    dt_range = pd.date_range(start=startDate+" 09:30:00-04:00", end=startDate+" 09:55:00-04:00", freq='5min')
    dr = df[df.index.isin(dt_range)]
    x = dr.High.idxmax(axis=0)
    print(x, df.High[x])

无循环简洁解决方案

利用Pandas的groupby分组功能,结合DatetimeIndex的date属性按日分组,无需手动处理交易日:

import pandas as pd
import yfinance as yf

# 获取数据
data = yf.download(tickers="MSFT", period="5d", interval="5m")
df = pd.DataFrame(data)

# 筛选09:30-09:55的时间段
filtered_df = df.between_time('09:30', '09:55')

# 按日期分组,找出每日High列最大值对应的时间戳
daily_max_index = filtered_df.groupby(filtered_df.index.date)['High'].idxmax()

# 提取结果并输出
daily_max_results = filtered_df.loc[daily_max_index, ['High']]
for timestamp, row in daily_max_results.iterrows():
    print(timestamp, row['High'])

输出结果

2024-03-11 09:30:00-04:00 404.20001220703125
2024-03-12 09:30:00-04:00 409.677001953125
2024-03-13 09:30:00-04:00 418.17999267578125
2024-03-14 09:40:00-04:00 424.95001220703125
2024-03-15 09:30:00-04:00 422.6000061035156

方案说明

  1. between_time:快速筛选每日指定时间段的数据,无需手动构造时间范围
  2. groupby(filtered_df.index.date):直接按索引的日期部分分组,自动跳过非交易日(原数据本身仅包含交易日的5分钟数据)
  3. idxmax():对每组的High列取最大值对应的时间戳,同时保留最高值的具体发生时间
  4. 全程无循环,代码简洁且不易出错,完全依赖Pandas原生功能实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:46:00