基于含Datetime标签的Dataframe计算设备运行周期时长、均值等指标
批量处理设备运行周期的实现方案
核心思路
通过时间序列标记+分组聚合的方式,自动识别每个完整的运行周期(从machine_started=1切换到machine_started=0),并批量计算周期统计指标。
步骤实现(基于Pandas)
假设你的DataFrame包含Datetime(时间戳)、machine_started(运行状态:1=运行,0=停机)、voltage(电压值)、hours(累计运行时长)字段,具体代码如下:
- 数据预处理
先确保时间序列有序,避免因乱序导致周期识别错误:
import pandas as pd # 转换时间字段为datetime类型 df['Datetime'] = pd.to_datetime(df['Datetime']) # 按时间排序并重置索引 df = df.sort_values('Datetime').reset_index(drop=True)
- 标记运行周期
通过状态变化生成唯一的周期ID,区分不同运行时段:
# 标记周期启动点:上一状态为停机(0)、当前状态为运行(1) df['cycle_start'] = (df['machine_started'] == 1) & (df['machine_started'].shift(1) == 0) # 生成周期ID:每个启动点后的数据归为同一周期 df['cycle_id'] = df['cycle_start'].cumsum() # 筛选仅运行状态的数据,排除停机时段 running_data = df[df['machine_started'] == 1].copy()
- 批量计算周期统计量
按周期ID分组,聚合所需指标:
cycle_metrics = running_data.groupby('cycle_id').agg( # 周期启动时刻(取该周期第一条记录的时间) cycle_start_time=('Datetime', 'first'), # 电压均值与标准差 voltage_mean=('voltage', 'mean'), voltage_std=('voltage', 'std'), # 周期时长:用累计hours的差值计算(若hours为累计运行时长) cycle_duration_hours=('hours', lambda x: x.max() - x.min()), # 若用时间戳计算时长(更准确),替换为: # cycle_duration_hours=('Datetime', lambda x: (x.max() - x.min()).total_seconds() / 3600) ).reset_index(drop=True)
- 过滤未完成周期(可选)
如果需要排除尚未结束的周期(即最后一条记录仍为machine_started=1),可添加以下逻辑:
# 标记周期结束点:上一状态为运行(1)、当前状态为停机(0) df['cycle_end'] = (df['machine_started'] == 0) & (df['machine_started'].shift(1) == 1) # 获取所有已完成周期的ID completed_cycle_ids = df[df['cycle_end']]['cycle_id'].shift(-1).dropna().astype(int) # 仅保留已完成的周期指标 completed_cycle_metrics = cycle_metrics[cycle_metrics['cycle_id'].isin(completed_cycle_ids)]
关键说明
- 必须确保
Datetime字段是有序的,否则周期识别会出现错误。 - 如果你的电压字段名不是
voltage,需替换为实际字段名。 - 周期时长的计算可根据
hours字段的定义选择对应方式:若hours是设备累计运行时长,用max-min;若hours是时间戳的小时部分,建议用时间戳差值计算更准确。
内容的提问来源于stack exchange,提问作者fix_my_bug
相关产品推荐
相关产品推荐

