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

查找时间序列中首个上升趋势下最接近0的行索引

解决方案:用Pandas定位时间序列中首个接近0的上升穿越点

核心单行实现

通过Pandas的布尔索引与链式调用,可直接筛选出符合条件的目标点:

target_row = df[(df['Signal'].shift(1) < 0) & (df['Signal'] >= 0)].loc[lambda x: x['Signal'].abs().idxmin()]

代码逻辑拆解

  • df['Signal'].shift(1) < 0:筛选出前一个时间点信号值为负的行,确保趋势是从负向正上升
  • df['Signal'] >= 0:当前时间点信号值非负,锁定上升穿越零点的区间
  • .loc[lambda x: x['Signal'].abs().idxmin()]:在所有符合条件的候选行中,找到信号绝对值最小(最接近0)的那一行

完整验证示例

将核心代码嵌入你的示例代码中,可得到预期结果:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

start_time = 0
end_time = 1
sample_rate = 500
time = np.arange(start_time, end_time, 1/sample_rate)
theta = 32
frequency = 2
amplitude = 1
sinewave = amplitude * np.sin(2 * np.pi * frequency * time + theta)

# DataFrame
df = pd.DataFrame([time, sinewave]).T
df.columns = ['Time','Signal']

# 核心单行代码
target_row = df[(df['Signal'].shift(1) < 0) & (df['Signal'] >= 0)].loc[lambda x: x['Signal'].abs().idxmin()]

# 输出结果
print(f"Index: {target_row.name}, Time: {target_row['Time']:.3f}, Signal: {target_row['Signal']}")

运行后输出:

Index: 227, Time: 0.454, Signal: 0.00602037947

边界情况处理

如果时间序列中不存在上升穿越零点的点(比如全正/全负序列),可添加空值判断避免报错:

if not target_row.empty:
    print(f"Index: {target_row.name}, Time: {target_row['Time']:.3f}, Signal: {target_row['Signal']}")
else:
    print("未找到符合条件的上升穿越零点的点")

内容的提问来源于stack exchange,提问作者Marc Schwambach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:01:24