|
@@ -0,0 +1,160 @@
|
|
|
+# 获取数据
|
|
|
+from LIB.BACKEND import DBManager
|
|
|
+
|
|
|
+import os
|
|
|
+import pandas as pd
|
|
|
+import numpy as np
|
|
|
+import datetime
|
|
|
+# import matplotlib.pyplot as plt
|
|
|
+#参数初始化
|
|
|
+Capacity = 53.6
|
|
|
+PackFullChrgVolt=69.99
|
|
|
+CellFullChrgVolt=3.6
|
|
|
+CellVoltNums=20
|
|
|
+CellTempNums=4
|
|
|
+FullChrgSoc=98
|
|
|
+PeakSoc=57
|
|
|
+
|
|
|
+#获取数据时间段
|
|
|
+now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
|
+now_time=datetime.datetime.strptime(now_time,'%Y-%m-%d %H:%M:%S')
|
|
|
+start_time=now_time-datetime.timedelta(days=2)
|
|
|
+end_time=str(now_time)
|
|
|
+strat_time=str(start_time)
|
|
|
+
|
|
|
+#输入一个含有‘SN号’的xlsx
|
|
|
+SNdata = pd.read_excel('骑享资产梳理-20210621.xlsx', sheet_name='6060')
|
|
|
+SNnums=SNdata['SN号']
|
|
|
+for k in range(len(SNnums)):
|
|
|
+ SNnum=str(SNnums[k])
|
|
|
+
|
|
|
+ sn = SNnum
|
|
|
+ st = strat_time
|
|
|
+ et = end_time
|
|
|
+
|
|
|
+ dbManager = DBManager.DBManager()
|
|
|
+ df_data = dbManager.get_data(sn=sn, start_time=st, end_time=et, data_groups=['bms'])
|
|
|
+ df_bms = df_data['bms']
|
|
|
+ # 计算电芯Soc差
|
|
|
+ packcrnt = df_bms['总电流[A]']
|
|
|
+ packvolt = df_bms['总电压[V]']
|
|
|
+ SOC = df_bms['SOC[%]']
|
|
|
+ SOH = df_bms['SOH[%]']
|
|
|
+ bmsstat = (df_bms['充电状态']).astype(int)
|
|
|
+ time = pd.to_datetime(df_bms['时间戳'], format='%Y-%m-%d %H:%M:%S')
|
|
|
+
|
|
|
+ # 筛选充电数据
|
|
|
+ ChgStart = []
|
|
|
+ ChgEnd = []
|
|
|
+
|
|
|
+ for i in range(3, len(time) - 3):
|
|
|
+ if i==3 and bmsstat[i]==2 and bmsstat[i+1]==2 and bmsstat[i+2]==2:
|
|
|
+ ChgStart.append(i)
|
|
|
+ elif bmsstat[i-2]!=2 and bmsstat[i-1]!=2 and bmsstat[i]==2:
|
|
|
+ ChgStart.append(i)
|
|
|
+ elif bmsstat[i-1]==2 and bmsstat[i]!=2 and bmsstat[i+1]!=2:
|
|
|
+ ChgEnd.append(i)
|
|
|
+ elif i == (len(time) - 4) and bmsstat[len(bmsstat)-1] == 2 and bmsstat[len(bmsstat)-2] == 2:
|
|
|
+ ChgEnd.append(len(time)-1)
|
|
|
+
|
|
|
+ # 筛选充电起始Soc<46%,电芯温度>15℃的数据
|
|
|
+ ChgStartValid = []
|
|
|
+ ChgEndValid = []
|
|
|
+
|
|
|
+ for i in range(min(len(ChgStart),len(ChgEnd))):
|
|
|
+ # 获取最小温度值
|
|
|
+ celltemp = []
|
|
|
+ for j in range(1, CellTempNums + 1):
|
|
|
+ s = str(j)
|
|
|
+ temp = df_bms['单体温度' + s]
|
|
|
+ celltemp.append(temp[ChgEnd[i]])
|
|
|
+
|
|
|
+ if SOC[ChgStart[i]] < 46 and SOC[ChgEnd[i]]>80 and min(celltemp) > 10:
|
|
|
+ if ((time[ChgEnd[i]]-time[ChgStart[i]]).total_seconds())/(ChgEnd[i]-ChgStart[i])<30:
|
|
|
+ ChgStartValid.append(ChgStart[i])
|
|
|
+ ChgEndValid.append(ChgEnd[i])
|
|
|
+
|
|
|
+ # 计算充电每个单体到达DVDQ峰值的Ah差
|
|
|
+ # 定义滑动平均滤波函数
|
|
|
+ def np_move_avg(a, n, mode="same"):
|
|
|
+ return (np.convolve(a, np.ones((n,)) / n, mode=mode))
|
|
|
+
|
|
|
+
|
|
|
+ # 定义函数:切片Soc>50且Soc<80,并寻找峰值返回峰值点的时间
|
|
|
+ def data_search(t, soc, cellvolt1, packcrnt1):
|
|
|
+ cellvolt2 = np_move_avg(cellvolt1, 5, mode="same")
|
|
|
+ Soc = 0
|
|
|
+ Ah = 0
|
|
|
+ Volt = [cellvolt2[0]]
|
|
|
+ DV_Volt = []
|
|
|
+ DQ_Ah = []
|
|
|
+ DVDQ = []
|
|
|
+ time1 = []
|
|
|
+ soc1 = []
|
|
|
+ soc2 = []
|
|
|
+
|
|
|
+ for m in range(1, len(t)):
|
|
|
+ Step = (t[m] - t[m - 1]).total_seconds()
|
|
|
+ Soc = Soc - packcrnt1[m] * Step * 100 / (3600 * Capacity)
|
|
|
+ Ah = Ah - packcrnt1[m] * Step / 3600
|
|
|
+ if (cellvolt2[m] - Volt[-1]) > 0.9 and Ah>0:
|
|
|
+ DQ_Ah.append(Ah)
|
|
|
+ Volt.append(cellvolt2[m])
|
|
|
+ DV_Volt.append(Volt[-1] - Volt[-2])
|
|
|
+ DVDQ.append((DV_Volt[-1]) / DQ_Ah[-1])
|
|
|
+ Ah = 0
|
|
|
+ time1.append(t[m])
|
|
|
+ soc1.append(Soc)
|
|
|
+ soc2.append(soc[m])
|
|
|
+ df_Data1 = pd.DataFrame({'Time': time1,
|
|
|
+ 'SOC': soc2,
|
|
|
+ 'DVDQ': DVDQ,
|
|
|
+ 'AhSOC': soc1})
|
|
|
+
|
|
|
+ df_Data1 = df_Data1[(df_Data1['SOC'] > 50) & (df_Data1['SOC'] < 75)]
|
|
|
+ # 寻找峰值点,且峰值点个数>3
|
|
|
+ if len(df_Data1['DVDQ'])>2:
|
|
|
+ PeakIndex = df_Data1['DVDQ'].idxmax()
|
|
|
+ df_Data2 = df_Data1[
|
|
|
+ (df_Data1['SOC'] > (df_Data1['SOC'][PeakIndex] - 0.5)) & (df_Data1['SOC'] < (df_Data1['SOC'][PeakIndex] + 0.5))]
|
|
|
+ if len(df_Data2) > 3:
|
|
|
+ return df_Data1['AhSOC'][PeakIndex]
|
|
|
+ else:
|
|
|
+ df_Data1 = df_Data1.drop([PeakIndex])
|
|
|
+ PeakIndex = df_Data1['DVDQ'].idxmax()
|
|
|
+ return df_Data1['AhSOC'][PeakIndex]
|
|
|
+
|
|
|
+
|
|
|
+ # 计算最大最小Soc差
|
|
|
+ if ChgStartValid:
|
|
|
+ DetaSoc2 = []
|
|
|
+ DetaSoc=[]
|
|
|
+ DetaSoc_SN=[]
|
|
|
+ DetaSoc_time=[]
|
|
|
+ for i in range(len(ChgStartValid)):
|
|
|
+ DetaSoc1 = []
|
|
|
+ for j in range(1, CellVoltNums + 1):
|
|
|
+ s = str(j)
|
|
|
+ cellvolt = df_bms['单体电压' + s]
|
|
|
+ cellvolt = list(cellvolt[ChgStartValid[i]:ChgEndValid[i]])
|
|
|
+ Time = list(time[ChgStartValid[i]:ChgEndValid[i]])
|
|
|
+ Packcrnt = list(packcrnt[ChgStartValid[i]:ChgEndValid[i]])
|
|
|
+ SOC1 = list(SOC[ChgStartValid[i]:ChgEndValid[i]])
|
|
|
+ a = data_search(Time, SOC1, cellvolt, Packcrnt)
|
|
|
+ if a:
|
|
|
+ DetaSoc1.append(a) # 计算到达峰值点的累计Soc
|
|
|
+ if DetaSoc1:
|
|
|
+ DetaSoc2.append(max(DetaSoc1) - min(DetaSoc1))
|
|
|
+
|
|
|
+ DetaSocMean = np.mean(DetaSoc2)
|
|
|
+ DetaSoc.append(DetaSocMean)
|
|
|
+ DetaSoc_SN.append(SNnum)
|
|
|
+ DetaSoc_time.append(time[ChgStartValid[-1]])
|
|
|
+
|
|
|
+
|
|
|
+ result_DetaSoc={'time':DetaSoc_time,
|
|
|
+ 'SN号':DetaSoc_SN,
|
|
|
+ 'Soc差':DetaSoc}
|
|
|
+ Result_DetaSoc=pd.DataFrame(result_DetaSoc)
|
|
|
+ print(Result_DetaSoc)
|
|
|
+
|