如何用Pandas按日计算电池充电率(时间序列数据处理)
按日计算电池充电率的解决方案
核心思路
通过按日期分组处理实现每日逻辑重置,对每个日期组内的Capacity值逐行累计,直到达到当日EnergySum阈值,超出阈值后后续行充电量设为0。
代码实现(基于Pandas)
假设你的CSV包含Datetime(时间戳)、Capacity(每小时可用充电容量)、EnergySum(当日总损耗量)三列,代码如下:
import pandas as pd # 读取CSV数据 df = pd.read_csv("battery_data.csv") # 处理时间列,提取日期作为分组键 df["Datetime"] = pd.to_datetime(df["Datetime"]) df["Date"] = df["Datetime"].dt.date # 定义单日期组的充电量计算函数 def compute_daily_charged(group): daily_energy_need = group["EnergySum"].iloc[0] # 当日总需补充电量 remaining = daily_energy_need charged_values = [] for cap in group["Capacity"]: if remaining <= 0: charged_values.append(0) continue # 计算当前行应充电量 if cap <= remaining: charged_values.append(cap) remaining -= cap else: charged_values.append(remaining) remaining = 0 group["Charged"] = charged_values return group # 按日期分组应用计算逻辑 processed_df = df.groupby("Date").apply(compute_daily_charged).drop(columns="Date") # 保存结果到新CSV processed_df.to_csv("battery_charged_result.csv", index=False)
代码说明
- 日期分组:通过提取
Datetime的日期部分创建Date列,用groupby("Date")实现每日数据独立处理,自动重置每日的累计逻辑。 - 逐行计算:对每个日期组,初始化
remaining为当日EnergySum,遍历每行Capacity:- 若剩余需补充电量≤0,直接填0;
- 若当前
Capacity未超过剩余量,全部充入,剩余量扣除对应值; - 若当前
Capacity超过剩余量,仅充入剩余部分,剩余量置0,后续行均填0。
- 结果输出:处理完成后删除临时的
Date列,保存为新CSV文件。
适配注意事项
- 如果你的
EnergySum列在同一日期内存在多个不同值,需先确认数据逻辑(比如取当日最大值/平均值),修改daily_energy_need的取值方式即可。 - 若CSV中无
Datetime列但有单独的日期列,直接用该日期列分组即可,无需提取日期。
内容的提问来源于stack exchange,提问作者saguero
相关产品推荐
相关产品推荐

