DataFrame子集化后分组均值绘图无变化问题求助
问题分析与解决方法
首先,先解决你最初掩码无效的问题:你的掩码逻辑存在错误!
mask = ~((ES.index.hour > 16) & (ES.index.hour < 17))
因为hour是整数类型,ES.index.hour >16匹配的是17点及以后的时间,ES.index.hour <17匹配的是16点及以前的时间,这两个条件的交集是空集——没有任何时间点会同时满足这两个条件。所以你的掩码等价于~False,所有数据都会被保留,自然起不到过滤作用。正确的掩码应该直接匹配16点整的小时:
mask = ~(ES.index.hour == 16) ES = ES[mask]
不过你后来用drop+between_time的方法是正确的,这个方法能准确选中所有日期的16:00-17:00时段数据。
接下来是核心问题:为什么移除数据后绘图完全没变化?
最可能的原因是:你的原始数据中根本不存在16:00至17:00的观测值!
从你给出的ES.head()来看,所有数据都是从19:15开始的,大概率你的整个数据集的时间范围都不包含16-17点的记录。这种情况下,无论是掩码过滤还是drop删除,都没有实际移除任何数据——因为本来就没有这些时段的数据,所以分组计算的均值和原图完全一致。
验证方法
你可以先检查数据中是否真的存在16:00-17:00的点:
# 统计该时段的记录数 print("16:00-17:00的记录数:", ES.between_time('16:00','17:00').shape[0])
如果输出是0,就说明确实没有这些数据,移除操作当然不会有效果。
额外优化建议
如果你确认数据中存在该时段数据且成功移除后,想要更清晰地看到绘图变化,可以把分组后的索引转换为易读的时间格式,避免MultiIndex带来的x轴显示问题:
fig = plt.figure() ax1 = fig.add_subplot(111) # 分组并计算均值 grouped_returns = ES.groupby([ES.index.hour, ES.index.minute]).mean() # 将MultiIndex转换为HH:MM格式的字符串 grouped_returns.index = grouped_returns.index.map(lambda x: f"{x[0]:02d}:{x[1]:02d}") # 绘图 plt.plot(grouped_returns) ax1.set_ylabel('Return') ax1.set_xlabel('5-minute interval') # 旋转x轴标签避免重叠 plt.xticks(rotation=45) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Rainymood
相关产品推荐
相关产品推荐

