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

基于日内数据计算每日高低价:DataFrame时间索引问题求助

解决日内行情DataFrame添加每日高低列的NaN问题

我之前也踩过这个坑!用resample('D')处理非午夜起始的日内数据时,确实会出现NaN的问题,原因其实很简单:resample('D')是严格按自然日午夜来划分周期的,比如你2018-05-13的数据从18:00开始,resample生成的日度最高值对应的索引是2018-05-13 00:00:00,和原DataFrame的2018-05-13 18:00:00及之后的索引完全不匹配,赋值后自然全是NaN,ffill也救不了——要么填充的是前一天的旧值,要么还是NaN。

正确的实现方法:用groupby + transform

直接按日期分组(不管当天的起始时间),然后用transform把每日的最高/最低值填充到对应行的每一条记录里,完美适配任意起始时间的日内数据:

# 假设你的DataFrame名为df,包含'high'和'low'列
# 添加每日最高列
df['day_high'] = df.groupby(df.index.date)['high'].transform('max')
# 添加每日最低列
df['day_low'] = df.groupby(df.index.date)['low'].transform('min')

原理说明

  • df.index.date会提取每个datetime索引的日期部分(比如2018-05-13 18:00:00会被提取为2018-05-13),所有同一天的行都会被分到同一组;
  • transform('max')会计算该组的最大值,然后把这个值填充到组内的每一行,这样每个时间点的记录都会对应到当天的真实最高/最低值,完全不会出现NaN。

替代写法(效果一致)

如果习惯用时间周期的方式分组,也可以用floor('D')把索引向下取整到当天午夜,分组效果是一样的:

df['day_high'] = df.groupby(df.index.floor('D'))['high'].transform('max')
df['day_low'] = df.groupby(df.index.floor('D'))['low'].transform('min')

这样处理后,不管你当天的数据是从18:00、9:30还是任何时间开始,都能准确生成对应的Daily High和Daily Low列,再也不会有NaN的问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:02:52