如何在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
方案说明
between_time:快速筛选每日指定时间段的数据,无需手动构造时间范围groupby(filtered_df.index.date):直接按索引的日期部分分组,自动跳过非交易日(原数据本身仅包含交易日的5分钟数据)idxmax():对每组的High列取最大值对应的时间戳,同时保留最高值的具体发生时间- 全程无循环,代码简洁且不易出错,完全依赖Pandas原生功能实现
内容的提问来源于stack exchange,提问作者Moritz
相关产品推荐
相关产品推荐

