时间序列数据时间戳处理及停机预测技术咨询
问题背景
我有如下格式的时间序列数据:
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
相关产品推荐
相关产品推荐

