基于日内数据计算每日高低价: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
相关产品推荐
相关产品推荐

