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

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列合并后再计算(见下方代码示例)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:55:18