查找时间序列中首个上升趋势下最接近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
相关产品推荐
相关产品推荐

