LFPDeltSoc20210804.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. # 获取数据
  2. from LIB.BACKEND import DBManager
  3. import os
  4. import pandas as pd
  5. import numpy as np
  6. import datetime
  7. # import matplotlib.pyplot as plt
  8. #参数初始化
  9. Capacity = 53.6
  10. PackFullChrgVolt=69.99
  11. CellFullChrgVolt=3.6
  12. CellVoltNums=20
  13. CellTempNums=4
  14. FullChrgSoc=98
  15. PeakSoc=57
  16. #获取数据时间段
  17. now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  18. now_time=datetime.datetime.strptime(now_time,'%Y-%m-%d %H:%M:%S')
  19. start_time=now_time-datetime.timedelta(days=2)
  20. end_time=str(now_time)
  21. strat_time=str(start_time)
  22. #输入一个含有‘SN号’的xlsx
  23. SNdata = pd.read_excel('骑享资产梳理-20210621.xlsx', sheet_name='6060')
  24. SNnums=SNdata['SN号']
  25. for k in range(len(SNnums)):
  26. SNnum=str(SNnums[k])
  27. sn = SNnum
  28. st = strat_time
  29. et = end_time
  30. dbManager = DBManager.DBManager()
  31. df_data = dbManager.get_data(sn=sn, start_time=st, end_time=et, data_groups=['bms'])
  32. df_bms = df_data['bms']
  33. # 计算电芯Soc差
  34. packcrnt = df_bms['总电流[A]']
  35. packvolt = df_bms['总电压[V]']
  36. SOC = df_bms['SOC[%]']
  37. SOH = df_bms['SOH[%]']
  38. bmsstat = (df_bms['充电状态']).astype(int)
  39. time = pd.to_datetime(df_bms['时间戳'], format='%Y-%m-%d %H:%M:%S')
  40. # 筛选充电数据
  41. ChgStart = []
  42. ChgEnd = []
  43. for i in range(3, len(time) - 3):
  44. if i==3 and bmsstat[i]==2 and bmsstat[i+1]==2 and bmsstat[i+2]==2:
  45. ChgStart.append(i)
  46. elif bmsstat[i-2]!=2 and bmsstat[i-1]!=2 and bmsstat[i]==2:
  47. ChgStart.append(i)
  48. elif bmsstat[i-1]==2 and bmsstat[i]!=2 and bmsstat[i+1]!=2:
  49. ChgEnd.append(i)
  50. elif i == (len(time) - 4) and bmsstat[len(bmsstat)-1] == 2 and bmsstat[len(bmsstat)-2] == 2:
  51. ChgEnd.append(len(time)-1)
  52. # 筛选充电起始Soc<46%,电芯温度>15℃的数据
  53. ChgStartValid = []
  54. ChgEndValid = []
  55. for i in range(min(len(ChgStart),len(ChgEnd))):
  56. # 获取最小温度值
  57. celltemp = []
  58. for j in range(1, CellTempNums + 1):
  59. s = str(j)
  60. temp = df_bms['单体温度' + s]
  61. celltemp.append(temp[ChgEnd[i]])
  62. if SOC[ChgStart[i]] < 46 and SOC[ChgEnd[i]]>80 and min(celltemp) > 10:
  63. if ((time[ChgEnd[i]]-time[ChgStart[i]]).total_seconds())/(ChgEnd[i]-ChgStart[i])<30:
  64. ChgStartValid.append(ChgStart[i])
  65. ChgEndValid.append(ChgEnd[i])
  66. # 计算充电每个单体到达DVDQ峰值的Ah差
  67. # 定义滑动平均滤波函数
  68. def np_move_avg(a, n, mode="same"):
  69. return (np.convolve(a, np.ones((n,)) / n, mode=mode))
  70. # 定义函数:切片Soc>50且Soc<80,并寻找峰值返回峰值点的时间
  71. def data_search(t, soc, cellvolt1, packcrnt1):
  72. cellvolt2 = np_move_avg(cellvolt1, 5, mode="same")
  73. Soc = 0
  74. Ah = 0
  75. Volt = [cellvolt2[0]]
  76. DV_Volt = []
  77. DQ_Ah = []
  78. DVDQ = []
  79. time1 = []
  80. soc1 = []
  81. soc2 = []
  82. for m in range(1, len(t)):
  83. Step = (t[m] - t[m - 1]).total_seconds()
  84. Soc = Soc - packcrnt1[m] * Step * 100 / (3600 * Capacity)
  85. Ah = Ah - packcrnt1[m] * Step / 3600
  86. if (cellvolt2[m] - Volt[-1]) > 0.9 and Ah>0:
  87. DQ_Ah.append(Ah)
  88. Volt.append(cellvolt2[m])
  89. DV_Volt.append(Volt[-1] - Volt[-2])
  90. DVDQ.append((DV_Volt[-1]) / DQ_Ah[-1])
  91. Ah = 0
  92. time1.append(t[m])
  93. soc1.append(Soc)
  94. soc2.append(soc[m])
  95. df_Data1 = pd.DataFrame({'Time': time1,
  96. 'SOC': soc2,
  97. 'DVDQ': DVDQ,
  98. 'AhSOC': soc1})
  99. df_Data1 = df_Data1[(df_Data1['SOC'] > 50) & (df_Data1['SOC'] < 75)]
  100. # 寻找峰值点,且峰值点个数>3
  101. if len(df_Data1['DVDQ'])>2:
  102. PeakIndex = df_Data1['DVDQ'].idxmax()
  103. df_Data2 = df_Data1[
  104. (df_Data1['SOC'] > (df_Data1['SOC'][PeakIndex] - 0.5)) & (df_Data1['SOC'] < (df_Data1['SOC'][PeakIndex] + 0.5))]
  105. if len(df_Data2) > 3:
  106. return df_Data1['AhSOC'][PeakIndex]
  107. else:
  108. df_Data1 = df_Data1.drop([PeakIndex])
  109. PeakIndex = df_Data1['DVDQ'].idxmax()
  110. return df_Data1['AhSOC'][PeakIndex]
  111. # 计算最大最小Soc差
  112. if ChgStartValid:
  113. DetaSoc2 = []
  114. DetaSoc=[]
  115. DetaSoc_SN=[]
  116. DetaSoc_time=[]
  117. for i in range(len(ChgStartValid)):
  118. DetaSoc1 = []
  119. for j in range(1, CellVoltNums + 1):
  120. s = str(j)
  121. cellvolt = df_bms['单体电压' + s]
  122. cellvolt = list(cellvolt[ChgStartValid[i]:ChgEndValid[i]])
  123. Time = list(time[ChgStartValid[i]:ChgEndValid[i]])
  124. Packcrnt = list(packcrnt[ChgStartValid[i]:ChgEndValid[i]])
  125. SOC1 = list(SOC[ChgStartValid[i]:ChgEndValid[i]])
  126. a = data_search(Time, SOC1, cellvolt, Packcrnt)
  127. if a:
  128. DetaSoc1.append(a) # 计算到达峰值点的累计Soc
  129. if DetaSoc1:
  130. DetaSoc2.append(max(DetaSoc1) - min(DetaSoc1))
  131. DetaSocMean = np.mean(DetaSoc2)
  132. DetaSoc.append(DetaSocMean)
  133. DetaSoc_SN.append(SNnum)
  134. DetaSoc_time.append(time[ChgStartValid[-1]])
  135. result_DetaSoc={'time':DetaSoc_time,
  136. 'SN号':DetaSoc_SN,
  137. 'Soc差':DetaSoc}
  138. Result_DetaSoc=pd.DataFrame(result_DetaSoc)
  139. print(Result_DetaSoc)