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

如何使用Python Pandas捕获时间序列数据中的周期步骤?

需求说明

需要从存储周期数据的DataFrame中提取每个周期的关键节点及对应时间,计算各关键节点之间的时间差。单周期内存在大量无需保留的中间步骤行,原有嵌套循环的实现逻辑仅能匹配到每个周期的前1-3个关键步骤,需要更稳定高效的实现方式。

数据示例

DataFrame数据样例

原有实现代码

time = []
phase = []

a=1

for z in range(len(Cycle)):
    if Cycle['CycleStep'][z] == 1:
        tstart = Cycle.loc[z, 'LocalDateTimeSource']
        time.append(tstart)
        phasestart = Cycle.loc[z, 'CycleStep']
        phase.append(phasestart)
        b=z+a
        
        while Cycle['CycleStep'][b] != 2 and b<4325:
            b+=1

        if Cycle['CycleStep'][b] == 2:
            phase2 = Cycle.loc[b, 'CycleStep']
            time2 = Cycle.loc[b, 'LocalDateTimeSource']
            phase.append(phase2)
            time.append(time2)
            c=b+a
            
            while Cycle['CycleStep'][c] != 3 and c<4325:
                c+=1
            
            if Cycle['CycleStep'][c] == 3:
                phase3 = Cycle.loc[c, 'CycleStep']
                time3 = Cycle.loc[c, 'LocalDateTimeSource']
                phase.append(phase3)
                time.append(time3)
                d=c+a
                
                while (Cycle['CycleStep'][d] != 4 and d<4325:
                    d+=1
                    
                if Cycle['CycleStep'][d] == 4:
                    phase4 = Cycle.loc[d, 'CycleStep']
                    time4 = Cycle.loc[d, 'LocalDateTimeSource']
                    phase.append(phase4)
                    time.append(time4)

原有代码问题

  • 硬编码多层嵌套判断步骤,扩展性极差,关键步骤数量调整时需要重写多层嵌套逻辑
  • 边界判断顺序错误:while循环先取索引值再判断索引是否越界,当索引超出数据范围时直接触发报错,导致后续步骤无法匹配
  • 硬编码数据长度阈值4325,数据量变化时代码直接失效
  • 逐行遍历+多层while查找效率极低,数据量较大时运行速度极慢
高效实现方案

采用pandas向量化操作实现,无需手动写逐行循环,稳定性和运行效率远高于嵌套循环写法:

import pandas as pd

# 先将时间列转换为datetime格式,支持时间差计算
Cycle['LocalDateTimeSource'] = pd.to_datetime(Cycle['LocalDateTimeSource'])

# 为每个周期生成唯一ID:每遇到一次步骤1,周期ID累加1
Cycle['cycle_id'] = (Cycle['CycleStep'] == 1).cumsum()

# 定义需要保留的关键步骤列表,后续调整提取步骤仅需修改此处
target_steps = [1, 2, 3, 4]
# 过滤掉所有非关键步骤的行
key_step_df = Cycle[Cycle['CycleStep'].isin(target_steps)].copy()

# 每个周期内的同一个关键步骤仅保留第一次出现的记录,自动跳过周期内的无关/重复行
key_step_df = key_step_df.drop_duplicates(subset=['cycle_id', 'CycleStep'], keep='first')

# 按周期ID、步骤号排序,保证步骤顺序正确
key_step_df = key_step_df.sort_values(by=['cycle_id', 'CycleStep']).reset_index(drop=True)

# 按周期分组,计算每个步骤和同周期上一个步骤的时间差
key_step_df['time_diff'] = key_step_df.groupby('cycle_id')['LocalDateTimeSource'].diff()

结果说明

  • 最终得到的key_step_df中,每个周期的每个关键步骤对应一行记录,包含步骤编号、对应采集时间
  • time_diff列即为当前步骤与同周期上一关键步骤的时间差,每个周期的起始步骤(步骤1)该列值为空,符合计算逻辑
  • 该方案无索引越界风险,支持任意长度的数据集,十万级行数据也可在毫秒级完成计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:24:21