基于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
代码说明
- 随机起始时间:通过在指定
start的前后30分钟区间内随机生成偏移秒数,得到实际充电起始点,符合需求的随机性要求。 - 时段匹配:用布尔掩码快速筛选出时间序列中属于充电时段的行,避免遍历整个序列。
- 分段充电值计算:
- 第一段根据实际起始时间与当前30分钟区间的重叠时长,按比例计算充电量
- 中间完整的30分钟区间直接填充满额
speed - 最后一段通过总容量减去前面的充电量,确保总充电量严格等于电池容量,避免浮点精度误差
- 数据填充:将计算好的充电值对应填充到时间序列的目标行中。
测试示例
# 生成空时间序列 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
相关产品推荐
相关产品推荐

