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

时间序列数据时间戳处理及停机预测技术咨询

问题背景

我有如下格式的时间序列数据:

import pandas as pd

data = {'Date': ['16-08-2021', '16-08-2021', '17-08-2021', '18-08-2021', '19-08-2021'],
        'Reason no': ['R13', 'R2', 'R5', 'R2', 'R3'],
        'Minutes': [115, 625, 625, 1364, 1440],
        'Issues': ['Not meeting the hourly target output', 'Air leak issue', 'other problem', 'Air leak issue', 'Air leak issue']}

df = pd.DataFrame(data)

可以看到2021年8月16日有两条不同的停机记录,我需要把这类同日期的多条数据拆成带具体小时的时间戳(比如16-08-2021 1AM),同时给所有日期补充时间特征。Minutes是停机时长,最终要预测未来两天的停机情况,示例输出如下:

{'Date': ['20-08-2021 5AM', '20-08-2021 6PM', '21-08-2021 12AM'],
        'Reason no': ['R5', 'R2', 'R2'],
        'Minutes': [655, 142, 425],
        'Issues': [ 'Air leak issue', 'other problem', 'Air leak issue']}

多数教程会把datetime当ID忽略,但我的场景里日期和时间戳是重要特征,计划用LSTM及混合模型训练,想知道怎么用Python和pandas处理同日期多条数据、保留datetime作为特征,同时希望得到相关建议。

处理步骤与代码实现

1. 生成带具体时间的时间戳

原数据只有日期没有具体时间,这里假设同日期的停机事件是按顺序发生的——前一个停机结束后,下一个才开始。基于这个逻辑生成每条记录的起始时间:

import pandas as pd
import numpy as np

# 加载初始数据
data = {'Date': ['16-08-2021', '16-08-2021', '17-08-2021', '18-08-2021', '19-08-2021'],
        'Reason no': ['R13', 'R2', 'R5', 'R2', 'R3'],
        'Minutes': [115, 625, 625, 1364, 1440],
        'Issues': ['Not meeting the hourly target output', 'Air leak issue', 'other problem', 'Air leak issue', 'Air leak issue']}

df = pd.DataFrame(data)

# 把Date列转为datetime类型,方便时间计算
df['Date'] = pd.to_datetime(df['Date'], format='%d-%m-%Y')

# 按日期分组,计算每条记录的起始分钟数(从当天0点开始算)
df['start_minutes'] = df.groupby('Date')['Minutes'].cumsum() - df['Minutes']
# 把分钟数转为时间差,加到日期上得到起始时间戳
df['start_time'] = df['Date'] + pd.to_timedelta(df['start_minutes'], unit='m')

# 格式化为用户需要的字符串样式(比如16-08-2021 1AM)
df['timestamp'] = df['start_time'].dt.strftime('%d-%m-%Y %I%p').str.lower().replace('0', '')

如果有真实的停机起始时间数据,直接替换上述逻辑即可,不要用假设值,避免引入偏差。

2. 提取时间特征

datetime作为核心特征,需要拆成模型能理解的数值特征:

# 提取年、月、日、小时
df['year'] = df['start_time'].dt.year
df['month'] = df['start_time'].dt.month
df['day'] = df['start_time'].dt.day
df['hour'] = df['start_time'].dt.hour

# 提取星期几(0=周一,6=周日)和是否工作日
df['day_of_week'] = df['start_time'].dt.dayofweek
df['is_workday'] = (df['day_of_week'] < 5).astype(int)

还可以根据业务需求补充其他特征,比如是否节假日、月度周期(每月几号)、季度特征等。

3. 编码分类特征

LSTM只接受数值输入,所以要把Reason no和Issues这类分类特征转成数值:

from sklearn.preprocessing import LabelEncoder

# 标签编码Reason no
le_reason = LabelEncoder()
df['reason_encoded'] = le_reason.fit_transform(df['Reason no'])

# 标签编码Issues
le_issue = LabelEncoder()
df['issues_encoded'] = le_issue.fit_transform(df['Issues'])

如果类别数量多,也可以用独热编码或者目标编码,根据模型需求选择。

4. 构造LSTM所需的序列数据

LSTM需要时序序列输入,比如用过去N条记录的特征预测未来2天的停机情况:

# 先按时间戳排序,保证时序正确
df = df.sort_values('start_time').reset_index(drop=True)

# 定义时间步:用过去3条记录预测未来
time_steps = 3

def create_sequences(data, time_steps):
    X, y = [], []
    # 遍历数据,构造输入序列和目标序列
    for i in range(len(data) - time_steps):
        # 输入:过去time_steps条的特征
        X.append(data.iloc[i:i+time_steps][['hour', 'day_of_week', 'is_workday', 'reason_encoded', 'issues_encoded', 'Minutes']].values)
        # 目标:未来2条的停机记录(可根据实际需求调整目标内容)
        y.append(data.iloc[i+time_steps:i+time_steps+2][['reason_encoded', 'issues_encoded', 'Minutes']].values)
    return np.array(X), np.array(y)

# 生成训练用的序列
X, y = create_sequences(df, time_steps)
关键建议
  • 时间戳逻辑要贴合业务:如果停机事件可能重叠,那之前的"顺序发生"假设就不成立,需要结合实际业务场景调整时间戳生成逻辑,比如如果有设备ID,要按设备分组处理。
  • 序列长度调优:时间步(time_steps)的大小要根据数据频率调整——如果是小时级数据,可能需要更长的序列;如果是每天多条记录,要保证序列的时间连续性。
  • 混合模型选型:可以尝试LSTM+CNN组合(CNN提取局部时间模式,LSTM处理长期依赖),或者LSTM+XGBoost(LSTM处理时序,XGBoost优化类别特征的拟合)。
  • 数据平衡处理:如果某些停机原因出现频率极低,模型容易偏向高频类别,这时候可以用过采样(SMOTE)或者加权损失函数来平衡数据。
  • 特征筛选:用相关性分析或者特征重要性排序,去掉冗余特征,避免模型过拟合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:47:49