import pandas as pd import numpy as np from datetime import datetime from datetime import timedelta def get_bms_drive_timetable(df_bms,battery_mode): '''对df_bms进行处理,得到行车的时间表。''' #####################step1 先使用电流做充电状态的判断############################################# if battery_mode==0:#mode=0,电流为正代表放电 condition_chrg=df_bms['bmspackcrnt']<0##根据电流,挑选充电状态 df_bms.loc[condition_chrg,'bscsta']='chrg' condition_drive=df_bms['bmspackcrnt']>0.01##根据电流,挑选行驶状态 df_bms.loc[condition_drive,'bscsta']='drive' df_bms.loc[~(condition_drive|condition_chrg),'bscsta']='idle'#静置状态 else :#mode=1,电流为负代表放电 condition_chrg=df_bms['bmspackcrnt']>0##根据电流,挑选充电状态 df_bms.loc[condition_chrg,'bscsta']='chrg' condition_drive=df_bms['bmspackcrnt']<-0.01##根据电流,挑选行驶状态 df_bms.loc[condition_drive,'bscsta']='drive' df_bms.loc[~(condition_drive|condition_chrg),'bscsta']='idle'#静置状态 #####################step2 对drive进行debounce,进入时立即进入,退出时debounce,5分钟。########## index=0 debounce_row=10#debounce判断持续10行 debounce_time=300#debounce判断持续300秒 #对上一步初步状态进行二次处理 while index<(len(df_bms)-debounce_row): mode_0=df_bms.loc[index,'bscsta'] mode_1=df_bms.loc[index+1,'bscsta'] #如果发现了边界行,则进行debounce判断 if (mode_0=='drive')&(mode_1!='drive'):#如果从drive变为idle accum_subtime=0#累计时间初始化 for sub_index in range(debounce_row):#往下处理10行 sub_time=df_bms.loc[index+sub_index,'deltatime'] accum_subtime+=sub_time #如果累计时间不到300秒,则设置为drive if accum_subtimestart_time)&(df_bms['time']=2: df_bms_head=df_bms_sub.head(1).copy()#首行 df_bms_startsoc=df_bms_head['bmspacksoc'].values[0] df_bms_tail=df_bms_sub.tail(1).copy()#尾行 df_bms_endsoc=df_bms_tail['bmspacksoc'].values[0] delta_soc=df_bms_startsoc-df_bms_endsoc if delta_soc>0: #如果df_bms出现时间不连续,则先计算deltasoc,deltasoc每变化1,续驶里程增加1, unrecorded_odo=delta_soc*1 #print('From '+str(start_time)+' to '+str(end_time)+' soc decrease: '+str(delta_soc)) else: unrecorded_odo=0#如果deltasoc不大于0,说明在充电,或者静置不动 #如果行数少于2,无法计算 else: unrecorded_odo=0 return unrecorded_odo