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

基于Pandas实现带随机起始的电池充电时序数据填充

实现电池充电时序数据插入函数

需求说明

要实现一个函数,将符合以下规则的电池充电时序数据插入到给定的空时间序列DataFrame中:

  • 电池容量固定,总充电量严格等于该容量
  • 充电速度为每半小时speed(示例值为5000)
  • 充电起始时间在指定start参数的前后半小时内随机生成
  • 根据随机起始时间,充电分段值可能出现首尾非满额的情况(比如起始段充2500、后续全充5000、最后一段充2500;或起始段充10、后续全充5000、最后一段充4990)

空时间序列生成代码:

import pandas as pd
import datetime

index = pd.date_range(datetime.datetime(2021,1,1), periods=1000, freq='30min')
columns = ['value']

df = pd.DataFrame(index=index, columns=columns)
df = df.fillna(0)
df = df.reset_index()

函数实现

import pandas as pd
import datetime
import random

def insertPattern(emptyTimeseriesDF, capacity, speed, start):
    # 复制原DataFrame,避免修改原始数据
    df = emptyTimeseriesDF.copy()
    # 生成随机起始时间:在指定start的前后30分钟范围内
    half_hour = datetime.timedelta(minutes=30)
    min_bound = start - half_hour
    max_bound = start + half_hour
    # 随机生成偏移秒数,确保落在区间内
    random_offset = random.randint(0, int(half_hour.total_seconds() * 2))
    actual_start = min_bound + datetime.timedelta(seconds=random_offset)
    
    # 计算充电结束时间
    total_charge_sec = (capacity / speed) * 1800  # 半小时=1800秒
    actual_end = actual_start + datetime.timedelta(seconds=total_charge_sec)
    
    # 筛选出时间序列中属于充电时段的行
    charge_mask = (df['index'] >= actual_start) & (df['index'] <= actual_end)
    charge_rows = df[charge_mask]
    
    if len(charge_rows) == 0:
        return df  # 充电时段不在序列范围内,直接返回原表
    
    # 计算各分段的充电值
    charge_values = []
    # 处理第一段:实际起始时间到当前30分钟区间结束的重叠时长
    first_interval_end = charge_rows.iloc[0]['index'] + half_hour
    first_overlap = min(first_interval_end, actual_end) - actual_start
    first_charge = (first_overlap.total_seconds() / 1800) * speed
    charge_values.append(first_charge)
    
    # 处理中间完整的30分钟段
    full_interval_count = len(charge_rows) - 2
    charge_values.extend([speed] * full_interval_count)
    
    # 处理最后一段:用总容量减去前面的充电量,确保总量准确
    if len(charge_rows) > 1:
        last_charge = capacity - sum(charge_values)
        charge_values.append(last_charge)
    
    # 将充电值填充回原DataFrame
    df.loc[charge_mask, 'value'] = charge_values
    
    return df

代码说明

  1. 随机起始时间:通过在指定start的前后30分钟区间内随机生成偏移秒数,得到实际充电起始点,符合需求的随机性要求。
  2. 时段匹配:用布尔掩码快速筛选出时间序列中属于充电时段的行,避免遍历整个序列。
  3. 分段充电值计算:
    • 第一段根据实际起始时间与当前30分钟区间的重叠时长,按比例计算充电量
    • 中间完整的30分钟区间直接填充满额speed
    • 最后一段通过总容量减去前面的充电量,确保总充电量严格等于电池容量,避免浮点精度误差
  4. 数据填充:将计算好的充电值对应填充到时间序列的目标行中。

测试示例

# 生成空时间序列
index = pd.date_range(datetime.datetime(2021,1,1), periods=1000, freq='30min')
columns = ['value']
empty_df = pd.DataFrame(index=index, columns=columns)
empty_df = empty_df.fillna(0)
empty_df = empty_df.reset_index()

# 调用函数插入充电模式
result_df = insertPattern(empty_df, capacity=30000, speed=5000, start=datetime.datetime(2021,1,2,12,0,0))

# 查看充电时段数据
print(result_df[result_df['value'] != 0])
# 验证总充电量是否符合要求
print(f"总充电量:{result_df['value'].sum()}")

内容的提问来源于stack exchange,提问作者Yiffany

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:55:17