
本文介绍如何使用 Pandas 结合 Python 迭代逻辑,按循环变化的时间增量(如 [1.0, 1.5])从时序 DataFrame 中提取“阶梯式采样”行——即每次依据当前行时间戳加对应间隔,查找首个满足条件的后续行,实现非均匀、状态依赖的过滤。
本文介绍如何使用 pandas 结合 python 迭代逻辑,按循环变化的时间增量(如 `[1.0, 1.5]`)从时序 dataframe 中提取“阶梯式采样”行——即每次依据当前行时间戳加对应间隔,查找首个满足条件的后续行,实现非均匀、状态依赖的过滤。
在时序数据分析中,有时需要按非固定步长对数据进行下采样,例如:首行作为起点,之后依次按 [1.0, 1.5, 1.0, 1.5, ...] 的循环间隔向前跳跃,每次选取首个 Timestamp ≥ 当前基准时间 + 当前间隔的行。这种逻辑无法通过 df.diff()、df.shift() 或布尔索引等标准 Pandas 向量化操作直接实现,因其具有状态依赖性(每一步的基准时间与所用间隔均依赖前一步结果),必须采用显式迭代。
核心思路是:
- 维护一个动态基准时间(last_t),初始为负无穷;
- 使用 itertools.cycle 循环遍历间隔数组(如 [1.0, 1.5]);
- 遍历原始 DataFrame 的 (index, Timestamp) 对,一旦当前时间戳 t >= last_t + current_interval,即选中该行,更新 last_t = t,并切换至下一个间隔。
以下是完整可运行示例:
import pandas as pd
from itertools import cycle
# 构造示例数据(与问题一致)
df = pd.DataFrame({
'Timestamp': [0.00, 0.94, 1.94, 3.00, 4.00, 5.94, 8.00, 9.00, 10.00],
'MeasureA': [26.46, 26.52, 30.01, 30.19, 30.07, 30.02, 30.22, 30.00, 30.00],
'MeasureB': [63.60, 78.87, 82.04, 82.00, 81.43, 82.46, 82.48, 82.21, 82.34],
'MeasureC': [3.90, 1.58, 1.13, 1.17, 1.13, 1.05, 0.98, 1.13, 1.12],
'MeasureD': [0.67, 0.42, 0.46, 0.36, 0.42, 0.34, 0.35, 0.33, 0.34]
})
# 定义循环间隔序列
intervals = [1.0, 1.5]
interval_cycle = cycle(intervals)
# 初始化
selected_indices = []
last_timestamp = float('-inf')
current_interval = next(interval_cycle)
# 主迭代逻辑
for idx, ts in zip(df.index, df['Timestamp']):
if ts >= last_timestamp + current_interval:
selected_indices.append(idx)
last_timestamp = ts
current_interval = next(interval_cycle) # 切换至下一间隔
# 获取结果子集
result_df = df.loc[selected_indices].reset_index(drop=True)
print(result_df)✅ 输出结果(与预期一致):
Timestamp MeasureA MeasureB MeasureC MeasureD 0 0.00 26.46 63.60 3.90 0.67 1 1.94 30.01 82.04 1.13 0.46 2 4.00 30.07 81.43 1.13 0.42 3 5.94 30.02 82.46 1.05 0.34 4 8.00 30.22 82.48 0.98 0.35 5 9.00 30.00 82.21 1.13 0.33
⚠️ 注意事项:
- 此方法不依赖索引连续性或单调性,但要求 Timestamp 列已排序(升序),否则可能跳过有效行;若未排序,请先执行 df = df.sort_values('Timestamp').reset_index(drop=True)。
- cycle 在首次调用 next() 时返回第一个元素,因此间隔序列按 [1.0, 1.5, 1.0, 1.5, ...] 循环,与题设“首步用 1.0 → 次步用 1.5”完全匹配。
- 若需更高性能(如超大数据集),可考虑用 numba 加速循环,但对万级以下数据,本方案简洁、清晰且足够高效。
- 该逻辑本质是贪心阶梯采样(greedy stride sampling),适用于传感器降频、事件驱动采样、自适应时间窗口等场景。
总结:当 Pandas 内置向量化操作无法覆盖状态依赖型过滤逻辑时,结合 itertools.cycle 与显式遍历是一种稳健、可读性强且易于扩展的解决方案。

















