import pandas as pd from tqdm import tqdm from pathlib import Path from scipy.interpolate import interp1d import warnings warnings.filterwarnings("ignore") df_soc_ocv= pd.read_csv('/home/limingze/zlwl-algos/USER/limingze/jvnheng/OCV_SOC.csv') charge_ocv_v = df_soc_ocv['OCV'] charge_ocv_soc = df_soc_ocv['SOC'] charge_ocv_v_list = [float(n) for n in charge_ocv_v] charge_ocv_soc_list = [float(n) for n in charge_ocv_soc] interp_func = interp1d(charge_ocv_v_list, charge_ocv_soc_list) num_cell= 240 num_pack = 20 cell_capacity = 360 filtered_data_all = pd.DataFrame() cellsoc_name = ['ALGO_SOC'+str(x+1) for x in range(num_cell)] cellvolt_name = ['V'+str(x+1) for x in range(num_cell)] p = Path("/home/limingze/zlwl-algos/USER/limingze/jvnheng/life_all_b07") FileList = list(p.glob("*.csv")) for File in tqdm(FileList): # df_in_all = pd.read_csv('/home/limingze/zlwl-algos/USER/limingze/jvnheng/life_all_b07/Bank08_20220806.csv', encoding='gbk') df_in_all = pd.read_csv(File, encoding='gbk') df_in_all = df_in_all[df_in_all['V1'] != '-'] df_in_all[cellvolt_name] = df_in_all[cellvolt_name].astype(float) df_in_all[cellsoc_name] = None # df_in_all = pd.read_csv('/data/common/yc/S002B03B06.csv', encoding='gbk') df_in_all['时间'] = pd.to_datetime(df_in_all['时间']) unique_dates = df_in_all['时间'].dt.date.unique() df_in_all['sn'] = 'S002B07B0' + str(File)[66] if '单体电压' in df_in_all.columns: df_in_all[cellvolt_name] = None df_in_all[cellvolt_name] = df_in_all['单体电压'].str.split(',', expand=True).astype(float) for n in range(num_cell): mask1 = (df_in_all['V'+str(n+1)].values >= charge_ocv_v_list[0]) & (df_in_all['V'+str(n+1)].values <= charge_ocv_v_list[-1]) mask2 = df_in_all['V'+str(n+1)].values < charge_ocv_v_list[0] mask3 = df_in_all['V'+str(n+1)].values > charge_ocv_v_list[-1] df_in_all.loc[mask1, 'ALGO_SOC'+str(n+1)] = interp_func(df_in_all['V'+str(n+1)].values[mask1]) df_in_all.loc[mask2, 'ALGO_SOC'+str(n+1)] = charge_ocv_soc_list[0] df_in_all.loc[mask3, 'ALGO_SOC'+str(n+1)] = charge_ocv_soc_list[-1] for date in tqdm(unique_dates): df_in = df_in_all[df_in_all['时间'].dt.date == date] df_in = df_in.sort_values(by='时间') df_in.reset_index(inplace=True) df_in['充电状态'] = pd.np.where(df_in['簇电流'] > 15, 1, pd.np.where(df_in['簇电流'] < -15, 2, 0)) # 0:静置;1:放电;2:充电 df_in['状态分组'] = (df_in['充电状态'] != df_in['充电状态'].shift()).cumsum() df_in['持续时间'] = df_in.groupby('状态分组')['时间'].transform(lambda x: x - x.min()) # df_in.to_csv('/home/limingze/zlwl-algos/USER/limingze/jvnheng/life_all_b07_result/劣化趋势/1.csv', encoding='utf-8-sig') # 筛选出充电状态持续为1的最后一条数据 filtered_data = df_in[(df_in['充电状态'] == 1)].sort_values(by='时间').groupby('状态分组').last() # filtered_data = filtered_data[((filtered_data['时间'].dt.hour >= 16) & (filtered_data['时间'].dt.hour <= 24)) | ((filtered_data['时间'].dt.hour >= 0) & (filtered_data['时间'].dt.hour <= 2))] filtered_data = filtered_data.reset_index() filtered_data['放电量'] = None filtered_data['放电起始时间'] = None filtered_data['放电结束时间'] = None filtered_data['放电起始SOC'] = None filtered_data['放电结束SOC'] = None filtered_data['放电时长'] = None filtered_data['SOC极差'] = None filtered_data['SOC方差'] = None filtered_data['放电起始堆电压'] = None filtered_data['放电起始簇电压'] = None filtered_data['放电起始簇最低电压'] = None for f in range(len(filtered_data)): fragment_data = df_in[df_in['状态分组']==filtered_data['状态分组'].iloc[f]] fragment_data['tm_delta'] = fragment_data['时间'].diff().dt.total_seconds() fragment_data['tm_delta'].iloc[0] = 60 fragment_data['charge'] = (fragment_data['簇电流'] * fragment_data['tm_delta']) / 3600 fragment_data['ah'] = fragment_data['charge'].cumsum() filtered_data['放电量'].iloc[f] = fragment_data['ah'].iloc[-1] filtered_data['放电起始时间'].iloc[f] = fragment_data['时间'].iloc[0] filtered_data['放电结束时间'].iloc[f] = fragment_data['时间'].iloc[-1] filtered_data['放电起始SOC'].iloc[f] = fragment_data['簇SOC'].iloc[0] filtered_data['放电结束SOC'].iloc[f] = fragment_data['簇SOC'].iloc[-1] filtered_data['放电时长'].iloc[f] = fragment_data['时间'].iloc[-1] - fragment_data['时间'].iloc[0] filtered_data['SOC极差'].iloc[f] = fragment_data[cellsoc_name].iloc[-1].max(axis=0) - fragment_data[cellsoc_name].iloc[-1].min(axis=0) filtered_data['SOC方差'].iloc[f] = fragment_data[cellsoc_name].iloc[-1].var(axis=0) filtered_data['放电起始堆电压'] = fragment_data['堆电压'].iloc[0] filtered_data['放电起始簇电压'] = fragment_data['簇总电压(HV1-Vbatt)'].iloc[0] filtered_data['放电起始簇最低电压'] = fragment_data['簇最低电压'].iloc[0] drop_num = 0 for g in range(1,len(filtered_data)): if ((filtered_data['状态分组'].loc[g] - filtered_data['状态分组'].loc[g-(drop_num+1)] <= 2) & (0 in df_in[(df_in['状态分组'] >= filtered_data['状态分组'].loc[g-(drop_num+1)]) & (df_in['状态分组'] <= filtered_data['状态分组'].loc[g])]['充电状态'].tolist())): filtered_data['放电量'].loc[g-(drop_num+1)] = filtered_data['放电量'].loc[g-(drop_num+1)] + filtered_data['放电量'].loc[g] filtered_data['放电结束时间'].loc[g-(drop_num+1)] = filtered_data['放电结束时间'].loc[g] filtered_data['放电结束SOC'].loc[g-(drop_num+1)] = filtered_data['放电结束SOC'].loc[g] filtered_data['放电时长'].loc[g-(drop_num+1)] = filtered_data['放电时长'].loc[g-(drop_num+1)] + filtered_data['放电时长'].loc[g] filtered_data['簇SOC'].loc[g-(drop_num+1)] = filtered_data['簇SOC'].loc[g] filtered_data['状态分组'].loc[g-(drop_num+1)] = filtered_data['状态分组'].loc[g] filtered_data['堆电压'].loc[g-(drop_num+1)] = filtered_data['堆电压'].loc[g] filtered_data['簇总电压(HV1-Vbatt)'].loc[g-(drop_num+1)] = filtered_data['簇总电压(HV1-Vbatt)'].loc[g] filtered_data['簇预充电压(HV2-Vpcs)'].loc[g-(drop_num+1)] = filtered_data['簇预充电压(HV2-Vpcs)'].loc[g] filtered_data['堆单体Vmin'].loc[g-(drop_num+1)] = filtered_data['堆单体Vmin'].loc[g] filtered_data['簇最低电压'].loc[g-(drop_num+1)] = filtered_data['簇最低电压'].loc[g] filtered_data['簇平均电压'].loc[g-(drop_num+1)] = filtered_data['簇平均电压'].loc[g] filtered_data.drop(g, inplace=True) drop_num += 1 else: drop_num = 0 filtered_data.reset_index() filtered_data_all = pd.concat([filtered_data_all, filtered_data], axis=0) filtered_data_all.to_csv('/home/limingze/zlwl-algos/USER/limingze/jvnheng/life_all_b07_result/劣化趋势/result.csv', encoding='utf-8-sig') filtered_data_all.to_csv('/home/limingze/zlwl-algos/USER/limingze/jvnheng/life_all_b07_result/劣化趋势/result.csv', encoding='utf-8-sig')