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

时序数据提取:车辆充放电周期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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:45:57