时序数据提取:车辆充放电周期SOC及时长计算需求
车辆SOC时序数据的充电/放电周期统计方案
以下是基于Pandas实现的具体解决方案,用于从包含SOC列的车辆时序数据中生成充电、放电周期的统计DataFrame:
步骤1:数据预处理与周期识别
首先需要对原始数据排序、计算SOC变化量,并为连续的充电/放电过程分配唯一周期ID:
import pandas as pd # 假设原始数据包含vehicle_id(车辆ID)、timestamp(时间戳)、soc(电池SOC值)三列 # 示例数据(可替换为你的真实数据) raw_data = pd.DataFrame({ 'vehicle_id': ['V001', 'V001', 'V001', 'V001', 'V002', 'V002', 'V002'], 'timestamp': pd.to_datetime([ '2024-05-01 07:00:00', '2024-05-01 08:00:00', '2024-05-01 09:00:00', '2024-05-01 10:00:00', '2024-05-01 08:30:00', '2024-05-01 09:30:00', '2024-05-01 10:30:00' ]), 'soc': [25, 45, 65, 40, 30, 55, 25] }) # 按车辆ID+时间戳排序,确保时序正确 raw_data = raw_data.sort_values(['vehicle_id', 'timestamp']).reset_index(drop=True) # 计算单步SOC变化量 raw_data['delta_soc'] = raw_data.groupby('vehicle_id')['soc'].diff().fillna(0) # 标记状态:充电(charge)/放电(discharge)/静止(idle) raw_data['status'] = pd.cut( raw_data['delta_soc'], bins=[-float('inf'), 0, float('inf')], labels=['discharge', 'charge'], include_lowest=True ) raw_data.loc[raw_data['delta_soc'] == 0, 'status'] = 'idle' # 为连续的同状态周期分配唯一组ID raw_data['cycle_group'] = ( raw_data.groupby('vehicle_id')['status'] .apply(lambda x: x.ne(x.shift()).cumsum()) )
步骤2:生成充电周期统计DataFrame
筛选充电状态数据,按车辆、日期、周期组聚合统计核心指标:
# 提取充电周期数据 charge_data = raw_data[raw_data['status'] == 'charge'].copy() charge_data['date'] = charge_data['timestamp'].dt.date # 统计充电周期指标 charge_stats = charge_data.groupby(['vehicle_id', 'date', 'cycle_group']).agg( min_soc=('soc', 'min'), max_soc=('soc', 'max'), duration_hour=('timestamp', lambda x: (x.max() - x.min()).total_seconds() / 3600), soc_increase=('soc', lambda x: x.max() - x.min()) ).reset_index(drop=False) # 可选:移除cycle_group列(若不需要保留周期唯一标识) charge_stats = charge_stats.drop(columns=['cycle_group'])
步骤3:生成放电周期统计DataFrame
同理处理放电周期,统计对应指标:
# 提取放电周期数据 discharge_data = raw_data[raw_data['status'] == 'discharge'].copy() discharge_data['date'] = discharge_data['timestamp'].dt.date # 统计放电周期指标 discharge_stats = discharge_data.groupby(['vehicle_id', 'date', 'cycle_group']).agg( max_soc=('soc', 'max'), min_soc=('soc', 'min'), duration_hour=('timestamp', lambda x: (x.max() - x.min()).total_seconds() / 3600), soc_decrease=('soc', lambda x: x.max() - x.min()) # 正值表示放电量,若需负值可改为x.min()-x.max() ).reset_index(drop=False) # 可选:移除cycle_group列 discharge_stats = discharge_stats.drop(columns=['cycle_group'])
关键说明
- 周期划分逻辑:连续的充电/放电记录会被归为同一个周期(例如连续3个时间点SOC持续上升,算作一次充电周期)
- 时长单位:示例中转换为小时,可根据需求改为
total_seconds()(秒)或total_seconds()/60(分钟) - SOC变化量:充电周期统计上升值,放电周期统计下降值(示例用正值表示放电量,可根据业务需求调整为负值)
- 静止数据:SOC无变化的记录被标记为
idle,不会纳入充电/放电统计,若需处理可修改状态标记逻辑
内容的提问来源于stack exchange,提问作者user20503189
相关产品推荐
相关产品推荐

