123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- # 读取数据
- import numpy as np
- import pandas as pd
- import preprocess.preprocess
- import importlib
- import ana.parameters
- import datetime
- import os
- import matplotlib
- import openpyxl
- file_path = r'D:\Work\Interior\Cloud_BMS\data_ana\7250.csv'
- sn_list = pd.read_csv(file_path,encoding='gbk')
- sn_list = sn_list.values.tolist()
- # print(sn_list)
- sn_list = [['PK504B10100004301']]
- df_res = pd.DataFrame(columns=['sn', 'date', 'odo', 'capacity', 'energy', 'energy_rate', 'acc_time_drive',
- 'acc_time_stand', 'acc_time_charge', 'avr_stand_tem', 'avr_stand_tem_rate',
- 'max_pwr', 'regen_flag', 'regen_rate', 'avr_speed', 'max_speed', 'avr_drive_tem',
- 'avr_drive_tem_rate', 'center_long', 'center_lat', 'rad'])
- df_soh_res = pd.DataFrame(columns=['sn', 'time', 'accum_ah', 'soh_cell01', 'soh_cell02', 'soh_cell03',
- 'soh_cell04', 'soh_cell05', 'soh_cell06', 'soh_cell07',
- 'soh_cell08', 'soh_cell09', 'soh_cell10', 'soh_cell11',
- 'soh_cell12', 'soh_cell13', 'soh_cell14', 'soh_cell15',
- 'soh_cell16', 'soh_cell17', 'soh_cell18', 'soh_cell19',
- 'soh_cell20'])
- df_cell_res = pd.DataFrame(columns=['sn', 'time', 'status', 'volt_cell01', 'volt_cell02', 'volt_cell03',
- 'volt_cell04', 'volt_cell05', 'volt_cell06', 'volt_cell07',
- 'volt_cell08', 'volt_cell09', 'volt_cell10', 'volt_cell11',
- 'volt_cell12', 'volt_cell13', 'volt_cell14', 'volt_cell15',
- 'volt_cell16', 'volt_cell17', 'volt_cell18', 'volt_cell19',
- 'volt_cell20', 'volt_max', 'volt_min', 'volt_avr', 'soc_diff',
- 'soc_diff_div', 'over_discharge'])
- for sn in sn_list:
- # 数据读取
- base_path = r'D:\Work\Interior\Cloud_BMS\data_ana\Data_Files'
- time = '_from_2020-04-27_to_2021-04-27.csv'
- bms_file = base_path + r'\\' + sn[0] + '\BMS_' + sn[0] + time
- gps_file = base_path + r'\\' + sn[0] + '\GPS_' + sn[0] + time
- # print(bms_file)
- if not os.path.exists(bms_file):
- print('{} bms file does not exist!!!!!!'.format(sn[0]))
- continue
- if not os.path.exists(gps_file):
- print('{} gps file does not exist!!!!!!'.format(sn[0]))
- continue
- df_bms = pd.read_csv(bms_file, encoding='GB2312')
- df_gps = pd.read_csv(gps_file, encoding='GB2312')
- df_bms = df_bms.drop_duplicates(['时间戳'])
- df_gps = df_gps.drop_duplicates(['时间戳'])
- df_bms = df_bms.reset_index(drop=True)
- df_gps = df_gps.reset_index(drop=True)
- df_bms['时间戳'] = pd.to_datetime(df_bms['时间戳'])
- df_gps['时间戳'] = pd.to_datetime(df_gps['时间戳'])
- print('{} data read Well Done!'.format(sn[0]))
- df_bms.to_csv('result2.csv', index=False, encoding='GB2312')
- # 数据预处理
- # 1、数据分段
- # 2、GPS数据可靠与否的判断(根据GPS计算出的平均车速<2认为可靠)
- importlib.reload(preprocess.preprocess)
- df_bms = preprocess.preprocess.data_split(df_bms)
- df_bms.to_csv('result.csv',encoding='GB2312')
- df_bms, df_gps, prepro_record = preprocess.preprocess.data_gps_judge(df_bms, df_gps, 2)
- print('{} data preprocess Well Done!'.format(sn[0]))
- df_bms.to_csv('result.csv', index=False, encoding='GB2312')
- df_gps.to_csv('result1.csv', index=False, encoding='GB2312')
- importlib.reload(ana.parameters)
- # test = ana.parameters.sta_one_drive_cycle(df_bms, df_gps, prepro_record, time_window=3600*24, step=3600*24, start_time="00:00:00")
- # print(test)
- # 计算Daily数据
- start_time = df_bms.loc[0, '时间戳']
- # print(start_time)
- cur_time = start_time
- index = 0
- while cur_time < df_bms.loc[len(df_bms) - 1, '时间戳']:
- if cur_time.day != start_time.day:
- break
- else:
- index = index + 1
- cur_time = df_bms.loc[index, '时间戳']
- start = '00:00:00'
- start_time = datetime.datetime.strptime(str(df_bms.loc[index, '时间戳'])[0:10] + ' ' + start, '%Y-%m-%d %H:%M:%S')
- # print(index, start_time)
- timeDelta = datetime.timedelta(days=1)
- end_time = start_time + timeDelta
- # print(start_time, end_time)
- while end_time < df_bms.loc[len(df_bms) - 1, '时间戳']:
- # while end_time < df_bms.loc[8500, '时间戳']:
- df_sel_bms = df_bms[(df_bms['时间戳'] >= start_time) & (df_bms['时间戳'] <= end_time)]
- df_sel_bms = df_sel_bms.reset_index(drop=True)
- df_sel_gps = df_gps[(df_gps['时间戳'] >= start_time) & (df_gps['时间戳'] <= end_time)]
- df_sel_gps = df_sel_gps.reset_index(drop=True)
- if len(df_sel_bms) == 0:
- continue
- date = ana.parameters.get_date(df_sel_bms)
- odo_total, odo_sum, odo_plus = ana.parameters.get_daily_odo(df_sel_bms, df_sel_gps)
- print('total={},odo={},plus={}'.format(odo_total, odo_sum, odo_plus))
- # 计算单日里程,单日平均车速,单日最高车速
- # print(start_time)
- odo, avr_speed, max_speed = ana.parameters.get_daily_odo_and_speed(df_sel_bms, df_sel_gps)
- # 计算单日使用容量,单日使用能量
- capacity, energy = ana.parameters.get_daily_capacity_and_energy(df_sel_bms, 55)
- # 计算单日平均电耗:kwh/100km
- if odo > 10:
- energy_rate = energy / odo * 100
- else:
- energy_rate = 0
- # 计算单日累积时间(行驶、静置、充电)
- acc_time_drive = ana.parameters.get_daily_accum_time(df_sel_bms, 'drive')
- acc_time_stand = ana.parameters.get_daily_accum_time(df_sel_bms, 'stand')
- acc_time_charge = ana.parameters.get_daily_accum_time(df_sel_bms, 'charge')
- # 计算过程平均温度,平均温升(静置、行驶)
- avr_stand_tem, avr_stand_tem_rate = ana.parameters.get_daily_stand_temp(df_sel_bms, 'stand')
- avr_drive_tem, avr_drive_tem_rate = ana.parameters.get_daily_stand_temp(df_sel_bms, 'drive')
- # 计算车辆功率
- max_pwr = ana.parameters.get_daily_max_pwr(df_sel_bms, 'drive')
- # 计算regen数据,是否有regen以及regen比例
- regen_flag, regen_rate = ana.parameters.get_daily_regen(df_sel_bms, 'drive')
- # 计算活动范围,圆心和半径
- center_long, center_lat, rad = ana.parameters.get_working_scope(df_sel_bms, df_sel_gps, 'drive')
- df_res = df_res.append({'sn': sn[0],
- 'date': date,
- 'odo': odo,
- 'capacity': capacity,
- 'energy': energy,
- 'energy_rate': energy_rate,
- 'acc_time_drive': acc_time_drive,
- 'acc_time_stand': acc_time_stand,
- 'acc_time_charge': acc_time_charge,
- 'avr_stand_tem': avr_stand_tem,
- 'avr_stand_tem_rate': avr_stand_tem_rate,
- 'max_pwr': max_pwr,
- 'regen_flag': regen_flag,
- 'regen_rate': regen_rate,
- 'avr_speed': avr_speed,
- 'max_speed': max_speed,
- 'avr_drive_tem': avr_drive_tem,
- 'avr_drive_tem_rate': avr_drive_tem_rate,
- 'center_long': center_long,
- 'center_lat': center_lat,
- 'rad': rad}, ignore_index=True)
- start_time = end_time
- end_time = start_time + timeDelta
- # print(end_time,df_bms.loc[len(df_bms) - 1, '时间戳'])
- print('{} daily data process Well Done!'.format(sn[0]))
- # 计算电池周期性数据
- df_soh_res_single, df_cell_res_single = ana.parameters.get_soh(df_bms, sn)
- df_soh_res = pd.concat([df_soh_res, df_soh_res_single], ignore_index=True)
- df_cell_res = pd.concat([df_cell_res, df_cell_res_single], ignore_index=True)
- print('{} period data process Well Done!'.format(sn[0]))
- path = r'D:\Work\Interior\Cloud_BMS\data_ana\report\daily_data_analysis.csv'
- df_res.to_csv(path, index=False, encoding='GB2312')
- path = r'D:\Work\Interior\Cloud_BMS\data_ana\report\period_data_analysis.xlsx'
- writer = pd.ExcelWriter(path)
- df_soh_res.to_excel(writer, "SOH数据")
- df_cell_res.to_excel(writer, "一致性数据")
- writer.save()
|