Python时间序列Excel计算异常:特定时段收盘价差值呈NaN
排查时间序列收盘价差值计算NaN及循环失效问题
核心问题排查方向
1. 索引/日期对齐失败
pandas列运算默认按索引对齐,如果df_1635和df_1625的日期索引不匹配(比如某日期仅存在于其中一个DataFrame,或datetime精度/时区不一致),就会生成NaN。
- 验证索引一致性:执行
print(df_1635.index.equals(df_1625.index)),返回False则说明索引不匹配。 - 解决方法:
- 统一datetime精度:用
df['Date'] = df['Date'].dt.floor('min')将时间截断到分钟级,避免毫秒/微秒差异。 - 按日期合并计算:放弃索引对齐,用
pd.merge按Date列合并后再计算(见下方代码示例)。
- 统一datetime精度:用
2. 时段筛选逻辑错误
如果df_1635或df_1625的筛选条件写错,会导致其中一侧数据为空或日期不匹配:
- 检查筛选后的样本数据:执行
print(df_1635.head())和print(df_1625.head()),确认两个DataFrame包含对应日期的时段数据。 - 修正筛选条件:用datetime时间属性精准筛选,比如:
from datetime import time df_1635 = df[df['Date'].dt.time == time(16, 35)] df_1625 = df[df['Date'].dt.time == time(16, 25)]
3. 循环内逻辑错误
循环计算失效通常是变量覆盖、结果未正确存储或遍历逻辑错误:
- 打印循环中间变量:在循环内加入
print(current_date, df_35.shape),检查每次迭代的日期和数据是否符合预期。 - 避免变量覆盖:如果循环内每次重新赋值
df_35,需用列表收集结果,比如:results = [] for date in date_list: df_35 = df[df['Date'].dt.date == date] # 执行计算逻辑 results.append(calculated_value) # 最后将结果转为DataFrame result_df = pd.DataFrame(results, columns=['diff'])
4. 原始数据空值影响
如果Close列本身存在空值,减法运算会直接生成NaN:
- 检查空值数量:执行
print(df_1635['Close'].isna().sum())和print(df_1625['Close'].isna().sum())。 - 处理空值:根据业务需求用
df['Close'].fillna(method='ffill')填充或df.dropna(subset=['Close'])删除缺失行。
推荐代码示例
按日期合并计算差值
from datetime import time # 筛选两个时段的数据,仅保留Date和Close列 df_1635 = df[df['Date'].dt.time == time(16, 35)][['Date', 'Close']] df_1625 = df[df['Date'].dt.time == time(16, 25)][['Date', 'Close']] # 按Date列合并,仅保留双方都存在的日期 merged_df = pd.merge(df_1635, df_1625, on='Date', suffixes=('_1635', '_1625')) # 计算差值 merged_df['diff_1635_1625'] = merged_df['Close_1635'] - merged_df['Close_1625']
统一索引后计算
from datetime import time # 将Date列设为索引,确保两个DataFrame索引类型一致 df_1635 = df[df['Date'].dt.time == time(16, 35)].set_index('Date') df_1625 = df[df['Date'].dt.time == time(16, 25)].set_index('Date') # 重新索引,对齐到df_1635的索引,缺失值可根据需求填充 df_1625_aligned = df_1625.reindex(df_1635.index, fill_value=0) # 计算差值 df_diff = df_1635['Close'] - df_1625_aligned['Close']
内容的提问来源于stack exchange,提问作者bean
相关产品推荐
相关产品推荐

