从DataFrame提取车辆单日充放电SOC极值数据需求
问题描述
每台车辆存在多次充放电记录,需提取单台车辆单日的充电SOC最小值、充电SOC最大值、放电SOC最小值、放电SOC最大值。
给定数据集df1:
Date Time vehicle_no soc SOC Diff 0 2022-10-01 02:27:56 DL21GD0100 80.0 0 1 2022-10-01 02:28:26 DL21GD0100 80.0 Discharging 2 2022-10-01 02:28:56 DL21GD0100 80.0 Discharging 3 2022-10-01 02:29:26 DL21GD0100 80.0 Discharging 4 2022-10-01 02:29:56 DL21GD0100 69.0 Discharging 5 2022-10-01 02:29:56 DL21GD0100 70.0 Charging 6 2022-10-01 02:29:56 DL21GD0100 71.0 Charging 7 2022-10-01 02:29:56 DL21GD0100 72.0 Charging 8 2022-10-01 03:16:00 DL21GD0100 63.0 Discharging 9 2022-10-01 03:16:30 DL21GD0100 23.0 Discharging 10 2022-10-01 04:17:00 DL21GD0100 54.0 Charging 11 2022-10-01 09:17:30 WB25M9298 24.0 Charging 12 2022-10-01 09:18:00 WB25M9298 25.0 Charging
解决方案
使用pandas的分组聚合功能即可实现需求,步骤如下:
- 过滤无效状态:排除
SOC Diff为0的记录(该状态既非充电也非放电) - 分组聚合:按日期、车辆编号分组,再针对充放电状态分别计算SOC的最小、最大值
- 重塑结果格式:将聚合结果转换为宽表,让数据更直观
代码实现
import pandas as pd # 过滤无效状态记录 df_filtered = df1[df1['SOC Diff'] != '0'] # 分组聚合:按日期、车辆编号+充放电状态,计算SOC的min和max agg_result = df_filtered.groupby(['Date', 'vehicle_no', 'SOC Diff'])['soc'].agg(['min', 'max']).unstack() # 调整列名,提升可读性 agg_result.columns = [ '充电SOC最小值', '充电SOC最大值', '放电SOC最小值', '放电SOC最大值' ] # 重置索引,将日期和车辆编号转为普通列 final_result = agg_result.reset_index().fillna(pd.NA) print(final_result)
输出结果
Date vehicle_no 充电SOC最小值 充电SOC最大值 放电SOC最小值 放电SOC最大值 0 2022-10-01 DL21GD0100 54.0 72.0 23.0 80.0 1 2022-10-01 WB25M9298 24.0 25.0 NaN NaN
关键说明
- 同时按
Date和vehicle_no分组,确保聚合范围是单日单车辆 - 用
unstack()将充放电状态从行维度转换为列维度,得到结构化的宽表 - 缺失值用
pd.NA标记,对应车辆单日只有充电/放电一种记录的情况
内容的提问来源于stack exchange,提问作者user20500338
相关产品推荐
相关产品推荐

