Browse Source

Merge branch 'dev' of http://git.fast-fun.cn:92/lmstack/data_analyze_platform into dev

lmstack 3 years ago
parent
commit
802adbd2b6

+ 64 - 0
LIB/MIDDLE/CellStateEstimation/Common/DBDowload/DBDownload.py

@@ -0,0 +1,64 @@
+import pymysql
+import time
+import pandas as pd
+
+class DBDownload:
+
+    def __init__(self, host='', port='', db='', user='', password='', mode=''):
+        self.host = host
+        self.port = port
+        self.db = db
+        self.user = user
+        self.password = password
+        self.mode=mode
+        pass
+
+    def __enter__(self):
+        self.connect()
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.close()
+
+    def connect(self):
+        conn_success_flag = 0
+        while not conn_success_flag:
+            try:
+                self.conn = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.password, database=self.db)
+            except Exception as e:
+                conn_success_flag = 0
+                print("数据库连接失败 :{}".format(e))
+                time.sleep(5)
+            else:
+                conn_success_flag = 1
+                print('数据库连接成功!')
+                self.cursor = self.conn.cursor()
+
+    def getdata(self,*param,tablename,sn,timename,st,sp):
+        print('数据获取中......')
+        param=list(param)
+        str=''
+        for i in range(len(param)):
+            if i<1:
+                str=str+param[i]
+            else:
+                str=str+','+param[i]
+        if self.mode==1:
+            self.cursor.execute("select %s from %s where sn='%s' order by id desc limit 1" %(str,tablename,sn))
+        else:
+            self.cursor.execute("select %s from %s where sn='%s' and %s between '%s' and '%s'" %(str,tablename,sn,timename,st,sp))
+        res = self.cursor.fetchall()
+        df_res = pd.DataFrame(res, columns=param)
+        df_res = df_res.reset_index(drop=True)
+        return(df_res)
+
+    def close(self):
+        try:
+            self.cursor.close()
+            self.conn.close()
+        except Exception as e:
+            print(e)
+        else:
+            print('数据库已断开连接!')
+    
+    

+ 64 - 0
LIB/MIDDLE/CellStateEstimation/Common/DBDowload/V1.0.1/DBDownload.py

@@ -0,0 +1,64 @@
+import pymysql
+import time
+import pandas as pd
+
+class DBDownload:
+
+    def __init__(self, host='', port='', db='', user='', password='', mode=''):
+        self.host = host
+        self.port = port
+        self.db = db
+        self.user = user
+        self.password = password
+        self.mode=mode
+        pass
+
+    def __enter__(self):
+        self.connect()
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.close()
+
+    def connect(self):
+        conn_success_flag = 0
+        while not conn_success_flag:
+            try:
+                self.conn = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.password, database=self.db)
+            except Exception as e:
+                conn_success_flag = 0
+                print("数据库连接失败 :{}".format(e))
+                time.sleep(5)
+            else:
+                conn_success_flag = 1
+                print('数据库连接成功!')
+                self.cursor = self.conn.cursor()
+
+    def getdata(self,*param,tablename,sn,timename,st,sp):
+        print('数据获取中......')
+        param=list(param)
+        str=''
+        for i in range(len(param)):
+            if i<1:
+                str=str+param[i]
+            else:
+                str=str+','+param[i]
+        if self.mode==1:
+            self.cursor.execute("select %s from %s where sn='%s' order by id desc limit 1" %(str,tablename,sn))
+        else:
+            self.cursor.execute("select %s from %s where sn='%s' and %s between '%s' and '%s'" %(str,tablename,sn,timename,st,sp))
+        res = self.cursor.fetchall()
+        df_res = pd.DataFrame(res, columns=param)
+        df_res = df_res.reset_index(drop=True)
+        return(df_res)
+
+    def close(self):
+        try:
+            self.cursor.close()
+            self.conn.close()
+        except Exception as e:
+            print(e)
+        else:
+            print('数据库已断开连接!')
+    
+    

+ 7 - 4
LIB/MIDDLE/CellStateEstimation/Common/DBDownload.py

@@ -4,12 +4,13 @@ import pandas as pd
 
 class DBDownload:
 
-    def __init__(self, host='', port='', db='', user='', password=''):
+    def __init__(self, host='', port='', db='', user='', password='', mode=''):
         self.host = host
         self.port = port
         self.db = db
         self.user = user
         self.password = password
+        self.mode=mode
         pass
 
     def __enter__(self):
@@ -33,7 +34,7 @@ class DBDownload:
                 print('数据库连接成功!')
                 self.cursor = self.conn.cursor()
 
-    def getdata(self,*param,tablename,sn):
+    def getdata(self,*param,tablename,sn,timename,st,sp):
         print('数据获取中......')
         param=list(param)
         str=''
@@ -42,8 +43,10 @@ class DBDownload:
                 str=str+param[i]
             else:
                 str=str+','+param[i]
-        # self.cursor.execute("select %s from %s where time between '%s' and '%s'" %(str,tablename,st,sp))
-        self.cursor.execute("select %s from %s where sn='%s' order by id desc limit 1" %(str,tablename,sn))
+        if self.mode==1:
+            self.cursor.execute("select %s from %s where sn='%s' order by id desc limit 1" %(str,tablename,sn))
+        else:
+            self.cursor.execute("select %s from %s where sn='%s' and %s between '%s' and '%s'" %(str,tablename,sn,timename,st,sp))
         res = self.cursor.fetchall()
         df_res = pd.DataFrame(res, columns=param)
         df_res = df_res.reset_index(drop=True)

+ 208 - 0
LIB/MIDDLE/CellStateEstimation/Common/V1_0_1/BatParam.py

@@ -0,0 +1,208 @@
+
+#定义电池参数
+
+class BatParam:
+    def __init__(self,celltype):
+
+        #公用参数................................................................................................................................................
+        self.CellTempUpLmt=119
+        self.CellTempLwLmt=-39
+        self.CellTempHighLv1=45
+        self.CellTempHighLv2=50
+        self.CellTempLowLv1=-20
+        self.CellTempLowLv2=-25
+        self.CellTempDiffLv1=10
+        self.CellTempDiffLv2=15
+        self.CellTempRate=5
+
+        self.SocJump=3
+        self.SocClamp=0.1
+        self.SocLow=3
+        self.SocDiff=20
+
+        self.SohLow=65
+        self.SohDiff=20
+
+        self.OcvWeight_Temp=[-30,-20,-10,0,10,20,30,40,50]
+        self.OcvWeight_StandingTime=[0,500,600,1200,1800,3600,7200,10800]
+        self.OcvWeight            =[[0,0,  0,  0,    0,   0.1,0.3, 1],
+                                    [0,0,  0,  0,    0,   0.1,0.3, 1],
+                                    [0,0,  0,  0,    0,   0.2,0.5, 1],
+                                    [0,0,  0,  0,    0.2, 0.4,0.8, 1],
+                                    [0,0,  0,  0.1,  0.3, 0.6,1,   1],
+                                    [0,0,  0.1,0.2,  0.5, 0.8,1,   1],
+                                    [0,0,  0.1,0.3,  0.6, 1,  1,   1],
+                                    [0,0,  0.1,0.3,  0.7, 1,  1,   1],
+                                    [0,0,  0.2,0.3,  0.8, 1,  1,   1]]
+
+
+        if celltype==1: #6040
+            self.Capacity = 41
+            self.PackFullChrgVolt=69.99
+            self.CellFullChrgVolt=4.2
+            self.CellFullChrgCrnt=-15
+            self.CellVoltNums=17
+            self.CellTempNums=4
+            self.FullChrgSoc=98
+            self.PackCrntDec=1
+            self.BalCurrent=0.015
+            self.LookTab_SOC = [0,	    3.5348,	8.3581,	13.181,	18.004,	22.827,	27.651,	32.474,	37.297,	42.120,	46.944,	51.767,	56.590,	61.413,	66.237,	71.060,	75.883,	80.707,	85.530,	90.353,	95.176,	100,   105]
+            self.LookTab_OCV = [3.3159,	3.4384,	3.4774,	3.5156,	3.5478,	3.5748,	3.6058,	3.6238,	3.638,	3.6535,	3.6715,	3.6951,	3.7279,	3.7757,	3.8126,	3.8529,	3.8969,	3.9446,	3.9946,	4.0491,	4.109,	4.183, 4.263]
+
+            self.CellOvLv1=4.3
+            self.CellOvLv2=4.35
+            self.CellUvLv1=2.8
+            self.CellUvLv2=2.5
+            self.CellVoltDiffLv1=0.3
+            self.CellVoltDiffLv2=0.5
+            self.PackVoltOvLv1=self.CellOvLv1*self.CellVoltNums
+            self.PackVoltOvLv2=self.CellOvLv2*self.CellVoltNums
+            self.PackVoltUvLv1=self.CellUvLv1*self.CellVoltNums
+            self.PackVoltUvLv2=self.CellUvLv2*self.CellVoltNums
+
+            self.PackChgOc=-40
+            self.PackDisOc=200
+
+            self.LeakCurrentLv1=10
+            self.LeakCurrentLv2=20
+            self.LeakCurrentLv3=50
+
+        elif celltype==2: #4840
+            self.Capacity = 41
+            self.PackFullChrgVolt=69.99
+            self.CellFullChrgVolt=4.2
+            self.CellFullChrgCrnt=-15
+            self.CellVoltNums=14
+            self.CellTempNums=4
+            self.FullChrgSoc=98
+            self.PackCrntDec=1
+            self.BalCurrent=0.015
+            self.LookTab_SOC = [0,	    3.5348,	8.3581,	13.181,	18.004,	22.827,	27.651,	32.474,	37.297,	42.120,	46.944,	51.767,	56.590,	61.413,	66.237,	71.060,	75.883,	80.707,	85.530,	90.353,	95.176,	100,   105]
+            self.LookTab_OCV = [3.3159,	3.4384,	3.4774,	3.5156,	3.5478,	3.5748,	3.6058,	3.6238,	3.638,	3.6535,	3.6715,	3.6951,	3.7279,	3.7757,	3.8126,	3.8529,	3.8969,	3.9446,	3.9946,	4.0491,	4.109,	4.183, 4.263]
+
+            self.CellOvLv1=4.3
+            self.CellOvLv2=4.35
+            self.CellUvLv1=2.8
+            self.CellUvLv2=2.5
+            self.CellVoltDiffLv1=0.3
+            self.CellVoltDiffLv2=0.5
+            self.PackVoltOvLv1=self.CellOvLv1*self.CellVoltNums
+            self.PackVoltOvLv2=self.CellOvLv2*self.CellVoltNums
+            self.PackVoltUvLv1=self.CellUvLv1*self.CellVoltNums
+            self.PackVoltUvLv2=self.CellUvLv2*self.CellVoltNums
+
+            self.PackChgOc=-40
+            self.PackDisOc=200
+
+            self.LeakCurrentLv1=10
+            self.LeakCurrentLv2=20
+            self.LeakCurrentLv3=50
+
+        elif celltype==3:   #力信50ah三元电芯
+            self.Capacity = 51
+            self.PackFullChrgVolt=80
+            self.CellFullChrgVolt=4.2
+            self.CellFullChrgCrnt=-15
+            self.CellVoltNums=20
+            self.CellTempNums=4
+            self.FullChrgSoc=98
+            self.PackCrntDec=1
+            self.BalCurrent=0.015
+            self.LookTab_SOC = [0,	    5,	    10,	    15,	    20,	    25,	    30,	    35,	    40,	    45,	    50,	    55,	    60,	    65,	    70,	    75,	    80,	    85,	    90,	    95,	    100,   105]
+            self.LookTab_OCV = [3.357, 	3.455, 	3.493, 	3.540, 	3.577, 	3.605, 	3.622, 	3.638, 	3.655, 	3.677, 	3.707, 	3.757, 	3.815, 	3.866, 	3.920, 	3.976, 	4.036, 	4.099, 	4.166, 	4.237, 	4.325, 4.415]
+
+            self.CellOvLv1=4.3
+            self.CellOvLv2=4.35
+            self.CellUvLv1=2.8
+            self.CellUvLv2=2.5
+            self.CellVoltDiffLv1=0.3
+            self.CellVoltDiffLv2=0.5
+            self.PackVoltOvLv1=self.CellOvLv1*self.CellVoltNums
+            self.PackVoltOvLv2=self.CellOvLv2*self.CellVoltNums
+            self.PackVoltUvLv1=self.CellUvLv1*self.CellVoltNums
+            self.PackVoltUvLv2=self.CellUvLv2*self.CellVoltNums
+
+            self.PackChgOc=-40
+            self.PackDisOc=200
+
+            self.LeakCurrentLv1=10
+            self.LeakCurrentLv2=20
+            self.LeakCurrentLv3=50
+
+        elif celltype==4:   #CATL 50ah三元电芯
+            self.Capacity = 50
+            self.PackFullChrgVolt=80
+            self.CellFullChrgVolt=4.2
+            self.CellFullChrgCrnt=-15
+            self.CellVoltNums=20
+            self.CellTempNums=2
+            self.FullChrgSoc=98
+            self.PeakSoc=57
+            self.PackCrntDec=-1
+            self.BalCurrent=0.015
+            self.LookTab_SOC = [0,	    5,	    10,	    15,	    20,	    25,	    30,	    35,	    40,	    45,	    50,	    55,	    60,	    65,	    70,	    75,	    80,	    85,	    90,	    95,	    100,   105]
+            self.LookTab_OCV = [3.152, 	3.397, 	3.438, 	3.481, 	3.523, 	3.560, 	3.586, 	3.604, 	3.620, 	3.638, 	3.661, 	3.693, 	3.748, 	3.803, 	3.853, 	3.903, 	3.953, 	4.006, 	4.063, 	4.121, 	4.183, 4.253]
+
+            self.CellOvLv1=4.3
+            self.CellOvLv2=4.35
+            self.CellUvLv1=2.8
+            self.CellUvLv2=2.5
+            self.CellVoltDiffLv1=0.3
+            self.CellVoltDiffLv2=0.5
+            self.PackVoltOvLv1=self.CellOvLv1*self.CellVoltNums
+            self.PackVoltOvLv2=self.CellOvLv2*self.CellVoltNums
+            self.PackVoltUvLv1=self.CellUvLv1*self.CellVoltNums
+            self.PackVoltUvLv2=self.CellUvLv2*self.CellVoltNums
+
+            self.PackChgOc=-40
+            self.PackDisOc=200
+
+            self.LeakCurrentLv1=10
+            self.LeakCurrentLv2=20
+            self.LeakCurrentLv3=50
+
+        elif celltype==99:   #60ah磷酸铁锂电芯
+            self.Capacity = 54
+            self.PackFullChrgVolt=69.99
+            self.CellFullChrgVolt=3.5
+            self.CellFullChrgCrnt=-20
+            self.OcvInflexionBelow=3.281
+            self.OcvInflexion2=3.296
+            self.OcvInflexion3=3.328
+            self.OcvInflexionAbove=3.4
+            self.SocInflexion1=30
+            self.SocInflexion2=60
+            self.SocInflexion3=70
+            self.CellVoltNums=20
+            self.CellTempNums=4
+            self.FullChrgSoc=98
+            self.PeakSoc=59
+            self.PeakVoltLowLmt=3.35
+            self.PeakVoltUpLmt=3.4
+            self.PeakCellVolt=[3.362,3.363,3.365,3.366,3.367]
+            self.PackCrntDec=1
+            self.BalCurrent=0.015
+            self.LookTab_SOC = [0.00, 	2.40, 	6.38, 	10.37, 	14.35, 	18.33, 	22.32, 	26.30, 	30.28, 	35.26, 	40.24, 	45.22, 	50.20, 	54.19, 	58.17, 	60.16, 	65.14, 	70.12, 	75.10, 	80.08, 	84.06, 	88.05, 	92.03, 	96.02, 	100.00]
+            self.LookTab_OCV = [2.7151,	3.0298,	3.1935,	3.2009,	3.2167,	3.2393,	3.2561,	3.2703,	3.2843,	3.2871,	3.2874,	3.2868,	3.2896,	3.2917,	3.2967,	3.3128,	3.3283,	3.3286,	3.3287,	3.3288,	3.3289,	3.3296,	3.3302,	3.3314,	3.3429]
+
+            self.CellOvLv1=3.68
+            self.CellOvLv2=3.7
+            self.CellUvLv1=2.1
+            self.CellUvLv2=2
+            self.CellVoltDiffLv1=0.6
+            self.CellVoltDiffLv2=1
+            self.PackVoltOvLv1=self.CellOvLv1*self.CellVoltNums
+            self.PackVoltOvLv2=self.CellOvLv2*self.CellVoltNums
+            self.PackVoltUvLv1=self.CellUvLv1*self.CellVoltNums
+            self.PackVoltUvLv2=self.CellUvLv2*self.CellVoltNums
+
+            self.PackChgOc=-40
+            self.PackDisOc=200
+
+            self.LeakCurrentLv1=20
+            self.LeakCurrentLv2=50
+            self.LeakCurrentLv3=100
+        else:
+            print('未找到对应电池编号!!!')
+            # sys.exit()
+

+ 56 - 0
LIB/MIDDLE/CellStateEstimation/Common/V1_0_1/DBDownload.py

@@ -0,0 +1,56 @@
+import pymysql
+import time
+import pandas as pd
+
+class DBDownload:
+
+    def __init__(self, host='', port='', db='', user='', password='', mode=''):
+        self.host = host
+        self.port = port
+        self.db = db
+        self.user = user
+        self.password = password
+        self.mode=mode
+        pass
+
+    def __enter__(self):
+        self.connect()
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.close()
+
+    def connect(self):
+        conn_success_flag = 0
+        while not conn_success_flag:
+            try:
+                self.conn = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.password, database=self.db)
+            except Exception as e:
+                conn_success_flag = 0
+                print("数据库连接失败 :{}".format(e))
+                time.sleep(5)
+            else:
+                conn_success_flag = 1
+                print('数据库连接成功!')
+                self.cursor = self.conn.cursor()
+
+    def getdata(self,param,tablename,sn,timename,st,sp):
+        print('数据获取中......')
+        if self.mode==1:
+            self.cursor.execute("select %s from %s where sn='%s' order by id desc limit 1" %(param,tablename,sn))
+        else:
+            self.cursor.execute("select %s from %s where sn='%s' and %s between '%s' and '%s'" %(param,tablename,sn,timename,st,sp))
+        res = self.cursor.fetchall()
+        df_res = pd.DataFrame(res, columns=param.split(','))
+        return(df_res)
+
+    def close(self):
+        try:
+            self.cursor.close()
+            self.conn.close()
+        except Exception as e:
+            print(e)
+        else:
+            print('数据库已断开连接!')
+    
+    

+ 24 - 0
LIB/MIDDLE/CellStateEstimation/Common/V1_0_1/log.py

@@ -0,0 +1,24 @@
+import logging
+import traceback
+
+class Mylog:
+
+    def __init__(self,log_name,log_level):
+        self.name=log_name
+        self.level=log_level
+    
+    def logcfg(self):
+        if len(self.level) > 0:
+            if self.level == 'debug':
+                Level=logging.DEBUG
+            elif self.level == 'info':
+                Level=logging.INFO
+            elif self.level == 'warning':
+                Level=logging.WARNING
+            else:
+                Level=logging.ERROR
+        logging.basicConfig(filename=r'D:\Platform\platform_python\data_analyze_platform\USER\spf\101log\\'+self.name, level=Level,format='%(asctime)s - %(levelname)s - %(message)s')
+
+    def logopt(self,*info):
+        logging.error(info)
+        logging.error(traceback.format_exc())

+ 22 - 20
LIB/MIDDLE/SaftyCenter/CellValueDiag/V1_0_0/SC_SamplingSafty.py

@@ -78,7 +78,7 @@ class SamplingSafty:
             if minVol<param.CellUVlmt:
                 QuitErrCount[10]=0
                 if not 10 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
-                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,10,3,'电池电压采样断线,最高电压为{:.2f}V,电池编号为{},最低电压为{:.2f}V,电池编号为{}'.format(maxVol,MaxBatNo,minVol,MinBatNo),'返厂维修']
+                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,10,3,'电池电压采样断线,最高电压为{:.2f}V,电池编号为{},最低电压为{:.2f}V,电池编号为{}'.format(maxVol,MaxBatNo,minVol,MinBatNo),'返厂维修']
                     ErrorFlg=1            
                 else:#如果故障发生当前故障中有该故障,则不进行操作
                     pass 
@@ -95,7 +95,7 @@ class SamplingSafty:
                 else:
                     pass
                 if not 50 in df_Diag_Ram['code'].values.tolist():
-                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,50,3,str(InVMaxBatNo)+'号电压大于{:.2f}V,采样无效'.format(param.CellOVlmt),'返厂维修']
+                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,50,3,str(InVMaxBatNo)+'号电压大于{:.2f}V,采样无效'.format(param.CellOVlmt),'返厂维修']
                     
                     ErrorFlg=1
                 else:
@@ -103,7 +103,7 @@ class SamplingSafty:
         elif minVol<param.CellUVlmt:
             QuitErrCount[50]=0
             if not 50 in df_Diag_Ram['code'].values.tolist():
-                df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,50,3,str(InVMinBatNo)+'号电压小于{:.2f}V,采样无效'.format(param.CellUVlmt),'返厂维修']
+                df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,50,3,str(InVMinBatNo)+'号电压小于{:.2f}V,采样无效'.format(param.CellUVlmt),'返厂维修']
                 
                 ErrorFlg=1
             else:
@@ -148,7 +148,7 @@ class SamplingSafty:
             if len(OutlierVolNo)>0:
                 QuitErrCount[51]=0
                 if not 51 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
-                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,51,2,str(OutlierVolNo)+'号电池电压离群','技术介入诊断']
+                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,51,2,str(OutlierVolNo)+'号电池电压离群','技术介入诊断']
                     
                     ErrorFlg=1            
                 else:#如果故障发生当前故障中有该故障,则不进行操作
@@ -168,7 +168,7 @@ class SamplingSafty:
             if len(StackVolNo)>0:
                 QuitErrCount[52]=0
                 if not 52 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
-                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,52,2,str(StackVolNo)+'号电池电压卡滞','技术介入诊断']
+                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,52,2,str(StackVolNo)+'号电池电压卡滞','技术介入诊断']
                     
                     ErrorFlg=1            
                 else:#如果故障发生当前故障中有该故障,则不进行操作
@@ -223,7 +223,7 @@ class SamplingSafty:
             if minCellTemp<param.PackUTlmt:
                 QuitErrCount[53]=0
                 if not 53 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
-                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,53,3,'电池温度采样断线,最高温度为{}℃,电池编号为{},最低温度为{}℃,电池编号为{}'.format(maxCellTemp,MaxBatNo,minCellTemp,MinBatNo),'返厂维修']
+                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,53,3,'电池温度采样断线,最高温度为{}℃,电池编号为{},最低温度为{}℃,电池编号为{}'.format(maxCellTemp,MaxBatNo,minCellTemp,MinBatNo),'返厂维修']
                     ErrorFlg=1            
                 else:#如果故障发生当前故障中有该故障,则不进行操作
                     pass 
@@ -241,7 +241,7 @@ class SamplingSafty:
                 else:
                     pass
                 if not 2 in df_Diag_Ram['code'].values.tolist():
-                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,2,3,str(InVMaxBatNo)+'号温度大于{}℃,采样无效'.format(param.PackOTlmt),'返厂维修']
+                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,2,3,str(InVMaxBatNo)+'号温度大于{}℃,采样无效'.format(param.PackOTlmt),'返厂维修']
                     
                     ErrorFlg=1
                 else:
@@ -249,7 +249,7 @@ class SamplingSafty:
         elif minCellTemp<param.PackUTlmt:
             QuitErrCount[2]=0
             if not 2 in df_Diag_Ram['code'].values.tolist():
-                df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,2,3,str(InVMinBatNo)+'号温度小于{}℃,采样无效'.format(param.PackUTlmt),'返厂维修']
+                df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,2,3,str(InVMinBatNo)+'号温度小于{}℃,采样无效'.format(param.PackUTlmt),'返厂维修']
                 
                 ErrorFlg=1
             else:
@@ -280,7 +280,7 @@ class SamplingSafty:
             if len(OutlierTempNo)>0:
                 QuitErrCount[8]=0
                 if not 8 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
-                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,8,2,str(OutlierTempNo)+'号电池异常温度离群','技术介入诊断']
+                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,8,2,str(OutlierTempNo)+'号电池异常温度离群','技术介入诊断']
                     
                     ErrorFlg=1            
                 else:#如果故障发生当前故障中有该故障,则不进行操作
@@ -306,12 +306,14 @@ class SamplingSafty:
         minOtherTempt=91
         ErrorFlg=0
         TotalOtherTemp=0
+        MaxOtherBatNo=0
+        MinOtherBatNo=0
         if param.OtherTempNums>0:
             for t in range(0,param.OtherTempNums):
                 BatNo=['其他温度'+str(t+1)]
                 maxOtherTemp=max(maxOtherTempt,float(bms_infoN[BatNo]))
                 if maxOtherTemp>maxOtherTempt:
-                    MaxBatNo=t+1
+                    MaxOtherBatNo=t+1
                     maxOtherTempt=maxOtherTemp
                 if float(bms_infoN[BatNo])>param.OtherOTlmt:
                     InVMaxOtherTempBatNo.append(t+1)                   
@@ -319,7 +321,7 @@ class SamplingSafty:
                     pass
                 minOtherTemp=min(minOtherTempt,float(bms_infoN[BatNo]))
                 if minOtherTemp<minOtherTempt:
-                    MinBatNo=t+1
+                    MinOtherBatNo=t+1
                     minOtherTempt=minOtherTemp
                 if float(bms_infoN[BatNo])<param.OtherUTlmt:
                     InVMinOtherTempBatNo.append(t+1)                   
@@ -335,7 +337,7 @@ class SamplingSafty:
                 if minOtherTemp<param.OtherUTlmt:
                     QuitErrCount[54]=0
                     if not 54 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
-                        df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,54,3,'其他温度采样断线,最高温度为{}℃,传感器编号为{},最低温度为{}℃,传感器编号为{}'.format(maxOtherTemp,MaxBatNo,minOtherTemp,MinBatNo),'返厂维修']
+                        df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,54,3,'其他温度采样断线,最高温度为{}℃,传感器编号为{},最低温度为{}℃,传感器编号为{}'.format(maxOtherTemp,MaxOtherBatNo,minOtherTemp,MinOtherBatNo),'返厂维修']
                         
                         ErrorFlg=1            
                     else:#如果故障发生当前故障中有该故障,则不进行操作
@@ -354,7 +356,7 @@ class SamplingSafty:
                     else:
                         pass
                     if not 55 in df_Diag_Ram['code'].values.tolist():
-                        df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,55,3,str(InVMaxBatNo)+'号传感器温度大于{}℃,采样无效'.format(param.OtherOTlmt),'联系用户核实电池情况,并返厂维修']
+                        df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,55,3,str(InVMaxOtherTempBatNo)+'号传感器温度大于{}℃,采样无效'.format(param.OtherOTlmt),'联系用户核实电池情况,并返厂维修']
                         
                         ErrorFlg=1
                     else:
@@ -362,7 +364,7 @@ class SamplingSafty:
             elif minOtherTemp<param.OtherUTlmt:
                 QuitErrCount[55]=0
                 if not 55 in df_Diag_Ram['code'].values.tolist():
-                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,55,3,str(InVMinBatNo)+'号传感器温度小于{}℃,采样无效'.format(param.OtherUTlmt),'返厂维修']
+                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,55,3,str(InVMinOtherTempBatNo)+'号传感器温度小于{}℃,采样无效'.format(param.OtherUTlmt),'返厂维修']
                     
                     ErrorFlg=1
                 else:
@@ -385,15 +387,15 @@ class SamplingSafty:
                         BatNo=['其他温度'+str(t+1)]
                         AvgOtherTempGap=abs((float(bms_infoN[BatNo]))-AvgOtherTemp)
                         if AvgOtherTempGap>param.AvgOtherTempGap and float(bms_infoN[BatNo])>param.OtherUTlmt and float(bms_infoN[BatNo])<param.OtherOTlmt and not 8 in df_Diag_Ram['code']:
-                            OutlierTempNo.append(t+1)
+                            OutlierOtherTempNo.append(t+1)
                 else:
                     AvgOtherTempGap=maxOtherTemp-minOtherTemp
                     if AvgOtherTempGap>param.AvgOtherTempGap and minOtherTemp>param.OtherUTlmt and maxOtherTemp<param.OtherOTlmt and not 8 in df_Diag_Ram['code']:
-                        OutlierTempNo=[1,2]
-                if len(OutlierTempNo)>0:
+                        OutlierOtherTempNo=[1,2]
+                if len(OutlierOtherTempNo)>0:
                     QuitErrCount[56]=0
                     if not 56 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
-                        df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,56,2,str(OutlierTempNo)+'号传感器温度异常离群','技术介入诊断']
+                        df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,56,2,str(OutlierOtherTempNo)+'号传感器温度异常离群','技术介入诊断']
                         
                         ErrorFlg=1            
                     else:#如果故障发生当前故障中有该故障,则不进行操作
@@ -409,7 +411,7 @@ class SamplingSafty:
             if (maxOtherTemp-maxCellTemp)>param.AvgOtherTempGap and  maxOtherTemp<param.OtherOTlmt and maxCellTemp<param.PackOTlmt:
                 QuitErrCount[56]=0
                 if not 56 in df_Diag_Ram['code'].values.tolist():
-                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,56,2,str(OutlierTempNo)+'号传感器温度异常离群','技术立即介入诊断']
+                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,56,2,str(OutlierOtherTempNo)+'号传感器温度异常离群','技术立即介入诊断']
                     
                     ErrorFlg=1
             else:
@@ -423,7 +425,7 @@ class SamplingSafty:
             if (maxCellTemp-maxOtherTemp)>param.AvgOtherTempGap and  maxOtherTemp<param.OtherOTlmt and maxCellTemp<param.PackOTlmt and not 8 in df_Diag_Ram['code']:
                 QuitErrCount[8]=0
                 if not 8 in df_Diag_Ram['code'].values.tolist():
-                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],0,sn,8,2,str(OutlierTempNo)+'号电芯温度异常离群','技术立即介入诊断']
+                    df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,8,2,str(OutlierTempNo)+'号电芯温度异常离群','技术立即介入诊断']
                     
                     ErrorFlg=1
             else:

+ 3 - 3
LIB/MIDDLE/SaftyCenter/CellValueDiag/main.py

@@ -87,8 +87,8 @@ def diag_cal():
         Diag_Ram_Dif=datacompy.Compare(df_Diag_Ram_Update,CellFltInfo,join_columns=['product_id','end_time','code'])
         Diag_Ram_Dif=Diag_Ram_Dif.df1_unq_rows    
         if len(Diag_Ram_Dif)>0:
-            Diag_Ram_Dif_New=Diag_Ram_Dif[Diag_Ram_Dif['end_time']==0]
-            Diag_Ram_Dif_Finish=df_Diag_Ram[df_Diag_Ram['end_time']!=0]
+            Diag_Ram_Dif_New=Diag_Ram_Dif[Diag_Ram_Dif['end_time']=='0000-00-00 00:00:00']
+            Diag_Ram_Dif_Finish=df_Diag_Ram[df_Diag_Ram['end_time']!='0000-00-00 00:00:00']
             if len(Diag_Ram_Dif_New)>0:
                 result=pd.read_csv(r'D:\Platform\platform_python\data_analyze_platform\USER\sxq\SaftyCenter_CODE_V1_1\result.csv',encoding='gbk')
                 result=result.append(Diag_Ram_Dif_New)
@@ -178,7 +178,7 @@ if __name__ == "__main__":
     #............................模块运行前,先读取数据库中所有结束时间为0的数据,需要从数据库中读取................
     result=pd.read_csv(r'D:\Platform\platform_python\data_analyze_platform\USER\sxq\SaftyCenter_CODE_V1_1\result.csv',encoding='gbk')
     
-    df_Diag_Ram=result[result['end_time']==0]
+    df_Diag_Ram=result[result['end_time']=='0000-00-00 00:00:00']
     print('----------------输入--------')
     print(df_Diag_Ram)
     #定时任务.......................................................................................................................................................................

+ 121 - 0
LIB/MIDDLE/SaftyCenter/Common/QX_BatteryParam.py

@@ -0,0 +1,121 @@
+class BatteryInfo():
+    def __init__(self,celltype):
+        self.CellMaxUSBTemp=55
+        self.AllowChgMinTemp=0
+        self.AllowDsChgTemp=-5
+        self.AvgVolGap=1
+        self.AvgCellTempGap=10
+        self.AvgOtherTempGap=30
+        self.PackOTlmt=65
+        self.PackUTlmt=-20
+        self.OtherOTlmt=91
+        self.OtherUTlmt=-20        
+        self.FaultCount=100
+
+
+
+        if celltype==1: #6040
+            self.Capacity = 41
+            self.PackFullChrgVolt=69.99
+            self.CellFullChrgVolt=4.2
+            self.CellVoltNums=17
+            self.CellTempNums=4
+            self.OtherTempNums=5
+            self.FullChrgSoc=98
+            self.PeakSoc=57
+            self.PackCrntDec=1
+            self.BalCurrent=0.015
+            self.LookTab_SOC = [0,	    3.5348,	8.3581,	13.181,	18.004,	22.827,	27.651,	32.474,	37.297,	42.120,	46.944,	51.767,	56.590,	61.413,	66.237,	71.060,	75.883,	80.707,	85.530,	90.353,	95.176,	100,   105]
+            self.LookTab_OCV = [3.3159,	3.4384,	3.4774,	3.5156,	3.5478,	3.5748,	3.6058,	3.6238,	3.638,	3.6535,	3.6715,	3.6951,	3.7279,	3.7757,	3.8126,	3.8529,	3.8969,	3.9446,	3.9946,	4.0491,	4.109,	4.183, 4.263]
+            self.BLVol = 3
+            self.CellOVlmt=5
+            self.CellUVlmt=2
+            self.CantChrgVol=3
+          
+        elif celltype==2: #4840
+            self.Capacity = 41
+            self.PackFullChrgVolt=69.99
+            self.CellFullChrgVolt=4.2
+            self.CellVoltNums=14
+            self.CellTempNums=4
+            self.OtherTempNums=5            
+            self.FullChrgSoc=98
+            self.PeakSoc=57
+            self.PackCrntDec=1
+            self.BalCurrent=0.015
+            self.LookTab_SOC = [0,	    3.5348,	8.3581,	13.181,	18.004,	22.827,	27.651,	32.474,	37.297,	42.120,	46.944,	51.767,	56.590,	61.413,	66.237,	71.060,	75.883,	80.707,	85.530,	90.353,	95.176,	100,   105]
+            self.LookTab_OCV = [3.3159,	3.4384,	3.4774,	3.5156,	3.5478,	3.5748,	3.6058,	3.6238,	3.638,	3.6535,	3.6715,	3.6951,	3.7279,	3.7757,	3.8126,	3.8529,	3.8969,	3.9446,	3.9946,	4.0491,	4.109,	4.183, 4.263]
+            self.BLVol = 3
+            self.CellOVlmt=5
+            self.CellUVlmt=2
+            self.CantChrgVol=3        
+
+        elif  celltype==3:   #力信50ah三元电芯
+            self.Capacity = 51
+            self.PackFullChrgVolt=80
+            self.CellFullChrgVolt=4.2
+            self.CellVoltNums=20
+            self.CellTempNums=4
+            self.OtherTempNums=1
+            self.FullChrgSoc=98
+            self.PeakSoc=57
+            self.PackCrntDec=1
+            self.BalCurrent=0.015
+            self.LookTab_SOC = [0,	    5,	    10,	    15,	    20,	    25,	    30,	    35,	    40,	    45,	    50,	    55,	    60,	    65,	    70,	    75,	    80,	    85,	    90,	    95,	    100,   105]
+            self.LookTab_OCV = [3.357, 	3.455, 	3.493, 	3.540, 	3.577, 	3.605, 	3.622, 	3.638, 	3.655, 	3.677, 	3.707, 	3.757, 	3.815, 	3.866, 	3.920, 	3.976, 	4.036, 	4.099, 	4.166, 	4.237, 	4.325, 4.415]
+            self.BLVol = 3
+            self.CellOVlmt=5
+            self.CellUVlmt=2
+            self.CantChrgVol=3
+
+        elif celltype==4:   #CATL 50ah三元电芯
+            self.Capacity = 50
+            self.PackFullChrgVolt=80
+            self.CellFullChrgVolt=4.2
+            self.CellVoltNums=20
+            self.CellTempNums=2
+            self.OtherTempNums=0
+            self.FullChrgSoc=98
+            self.PeakSoc=57
+            self.PackCrntDec=-1
+            self.BalCurrent=0.015
+            self.LookTab_SOC = [0,	    5,	    10,	    15,	    20,	    25,	    30,	    35,	    40,	    45,	    50,	    55,	    60,	    65,	    70,	    75,	    80,	    85,	    90,	    95,	    100,   105]
+            self.LookTab_OCV = [3.152, 	3.397, 	3.438, 	3.481, 	3.523, 	3.560, 	3.586, 	3.604, 	3.620, 	3.638, 	3.661, 	3.693, 	3.748, 	3.803, 	3.853, 	3.903, 	3.953, 	4.006, 	4.063, 	4.121, 	4.183, 4.253]
+            self.BLVol = 3
+            self.CellOVlmt=5
+            self.CellUVlmt=2
+            self.CantChrgVol=3
+          
+
+        elif celltype==99:   #60ah磷酸铁锂电芯
+            self.Capacity = 54
+            self.PackFullChrgVolt=69.99
+            self.CellFullChrgVolt=3.5
+            self.OcvInflexionBelow=3.285
+            self.OcvInflexion2=3.296
+            self.OcvInflexion3=3.328
+            self.OcvInflexionAbove=3.4
+            self.CellVoltNums=20
+            self.CellTempNums=4
+            self.OtherTempNums=5 
+            self.FullChrgSoc=98
+            self.PeakSoc=59
+            self.PeakVoltLowLmt=3.35
+            self.PeakVoltUpLmt=3.4
+            self.PeakCellVolt=[3.362,3.363,3.365,3.366,3.367]
+            self.PackCrntDec=1
+            self.BalCurrent=0.015
+            self.LookTab_SOC = [0.00, 	2.40, 	6.38, 	10.37, 	14.35, 	18.33, 	22.32, 	26.30, 	30.28, 	35.26, 	40.24, 	45.22, 	50.20, 	54.19, 	58.17, 	60.16, 	65.14, 	70.12, 	75.10, 	80.08, 	84.06, 	88.05, 	92.03, 	96.02, 	100.00]
+            self.LookTab_OCV = [2.7151,	3.0298,	3.1935,	3.2009,	3.2167,	3.2393,	3.2561,	3.2703,	3.2843,	3.2871,	3.2874,	3.2868,	3.2896,	3.2917,	3.2967,	3.3128,	3.3283,	3.3286,	3.3287,	3.3288,	3.3289,	3.3296,	3.3302,	3.3314,	3.3429]
+            self.BLVol = 3
+            self.CellOVlmt=4
+            self.CellUVlmt=2
+            self.CantChrgVol=2.6
+ 
+
+
+
+
+        else:
+            print('未找到对应电池编号!!!')
+            # sys.exit()

+ 1 - 2
LIB/MIDDLE/odo/DailyMileageEstimation/main_daily_mileage.py → LIB/MIDDLE/odo/DailyMileageEstimation/V1_0_1/main_daily_mileage.py

@@ -1,4 +1,3 @@
-
 from LIB.BACKEND import DBManager
 import mileage
 from LIB.MIDDLE.CellStateEstimation.Common import log
@@ -31,7 +30,7 @@ for k in range(l):
         data_gps = df_data['gps']
 
         #...............每日累积里程............................................................................
-        if len(data_bms['时间戳'])>0:
+        if len(data_bms['时间戳'])>0 and len(data_gps['时间戳'])>0:
             df_res = mileage.cal_mileage(sn,data_gps,data_bms)
             df_res.to_csv('Mileage_'+sn+'.csv')
         

+ 35 - 0
LIB/MIDDLE/odo/DailyMileageEstimation/V1_0_1/main_mileage.py

@@ -0,0 +1,35 @@
+
+from LIB.BACKEND import DBManager
+import mileage
+from LIB.MIDDLE.CellStateEstimation.Common import log
+import datetime
+import pandas as pd
+
+dbManager = DBManager.DBManager()
+
+dataSOH = pd.read_excel('sn-20210903.xlsx',sheet_name='sn-20210903')
+fileNames = dataSOH['sn']
+fileNames = list(fileNames)
+l = len(fileNames)
+
+#log信息配置
+mylog=log.Mylog('log.txt','error')
+mylog.logcfg()
+
+
+for k in range(l):
+    try:
+        sn = fileNames[k]
+        df_data = dbManager.get_data(sn=sn, start_time='2021-07-01 00:00:00', end_time='2021-10-20 00:00:00', data_groups=['bms','gps'])
+        data_bms = df_data['bms']
+        data_gps = df_data['gps']
+
+        #...............每日累积里程............................................................................
+        if len(data_bms['时间戳'])>0 and len(data_gps['时间戳'])>0:
+            df_res = mileage.cal_mileage(sn,data_gps,data_bms)
+            df_res.to_csv('Mileage_'+sn+'.csv')
+        
+    except Exception as e:
+        print(repr(e))
+        mylog.logopt(sn,e)
+        pass

+ 277 - 0
LIB/MIDDLE/odo/DailyMileageEstimation/V1_0_1/mileage.py

@@ -0,0 +1,277 @@
+import pandas as pd
+import numpy as np
+from LIB.BACKEND.DataPreProcess import DataPreProcess
+import os
+import math
+import datetime
+import time
+
+def cal_mileage(sn,data_gps,data_bms):
+
+    
+    #将时间戳由 "%Y-%m-%d %H:%M:%S" 切换为 sec
+    def timeconvert(df_in,column_name):  
+        df=df_in.copy()
+        df.index=range(len(df))
+        time=df[column_name]
+        timeInSeries=[]
+        
+        time2=datetime.datetime.strptime(time[0],"%Y-%m-%d %H:%M:%S")
+        for k in range(len(time)):
+            time1=datetime.datetime.strptime(time[k],"%Y-%m-%d %H:%M:%S")    
+            t=(time1-time2)
+            timeInSeries.append(t.days*86400+t.seconds)
+        df.loc[:,'相对时间[s]']=pd.DataFrame(timeInSeries,columns=['相对时间[s]'])
+        return df
+
+    data_bms=timeconvert(data_bms,'时间戳')
+
+    #计算累积能量
+    def cal_accumKwh(df_in):
+        I=df_in['总电流[A]'].values
+        V=df_in['总电压[V]'].values
+        t=df_in['相对时间[s]'].values
+        accumAh=[0.0]
+        for k in range(1,len(I)):
+            accumAh_temp=(t[k]-t[k-1])*((I[k]+I[k-1])/(2*3600))*(V[k]+V[k-1])/2/1000
+            accumAh.append(accumAh[-1]+accumAh_temp)
+        df_in.loc[:,'累积能量[Kwh]']=accumAh
+        return(df_in)
+
+    data_bms=cal_accumKwh(data_bms)
+
+    #合并两张表格
+    df_bms=data_bms.copy()
+    df_gps=data_gps.copy()
+    df_bms.set_index(["时间戳"], inplace=True)
+    df_gps.set_index(["时间戳"], inplace=True)
+    df_temp = df_bms.append(df_gps)
+    df_temp=df_temp.sort_index(ascending=True)
+    df_temp.loc[:,'时间']=df_temp.index
+    df_temp.index=[k for k in range(len(df_temp))]
+    df_sheetCat=df_temp.copy()
+    df_sheetCat=timeconvert(df_sheetCat,'时间')
+    df_sheetCat=df_sheetCat.rename(columns={'时间':'时间戳'})
+    df_sheetCat=DataPreProcess.data_split_by_status(DataPreProcess,df_sheetCat, drive_interval_threshold=120, charge_interval_threshold=300, drive_stand_threshold=120, charge_stand_threshold=300)
+
+    #数据整理
+    df1=df_sheetCat.copy()
+    #如果前后data_status均不为none,但是本次为none,则将本次data_status设置为与上次相同。
+    data_status=df1['data_status'].values
+    for k in range(1,len(data_status)-1):
+        if data_status[k-1]!='none' and data_status[k+1]!='none':
+            df1.loc[k,'data_status']=data_status[k-1]
+
+    #如果前后两次电流值均不为nan,则将总电流[A]、总电压[V]、SOC[%]设置为与前次相同。
+    data_current=df1['总电流[A]'].values
+    for k in range(1,len(data_current)-1):
+        if not math.isnan(data_current[k-1]) and not math.isnan(data_current[k+1]) and math.isnan(data_current[k]):
+            df1.loc[k,'总电流[A]']=df1.loc[k-1,'总电流[A]']
+            df1.loc[k,'总电压[V]']=df1.loc[k-1,'总电压[V]']
+            df1.loc[k,'SOC[%]']=df1.loc[k-1,'SOC[%]']
+
+    #如果前后两次能量均不是NAN,但是本次为NAN,则将上次的能量指赋值给本次
+    AccumEnergy=df1['累积能量[Kwh]'].values
+    for k in range(1,len(AccumEnergy)-1):
+        if not math.isnan(AccumEnergy[k-1]) and not math.isnan(AccumEnergy[k+1]) and math.isnan(AccumEnergy[k]):
+            df1.loc[k,'累积能量[Kwh]']=AccumEnergy[k-1]
+
+    #删除一些无用列,获取用于计算的数据
+    df_input=df1[['时间戳','总电流[A]', '总电压[V]','SOC[%]','相对时间[s]', '累积能量[Kwh]','纬度', '经度','data_status']]
+    #筛选出有经纬度信息的数据
+    df_gpsOnly=df_input[df_input['纬度']>0]
+
+    #根据经纬度获取两点之间的距离
+    def cal_dis_meters(radius,latitude1, longitude1,latitude2, longitude2):  
+        radLat1 = (math.pi/180)*latitude1  
+        radLat2 = (math.pi/180)*latitude2  
+        radLng1 = (math.pi/180)*longitude1  
+        radLng2= (math.pi/180)*longitude2      
+        d=2*math.asin(math.sqrt(math.pow(math.sin((radLat1-radLat2)/2.0),2)+math.cos(radLat1)*math.cos(radLat2)*math.pow(math.sin((radLng1-radLng2)/2.0),2)))*radius
+        return d
+
+    #根据gps数据计算△距离1和△距离2
+    #△距离1:直接根据两次的经度和纬度计算得到的马氏距离
+    #△距离2:当两次上报经纬度的时间间隔<60sec时,如果车辆为行驶状态则使用两次的经纬度求得的马氏距离,
+    #如果车辆不为行驶状态,则为0.
+    index_list=df_gpsOnly.index
+    pos_list=df_gpsOnly[['纬度','经度']].values
+    time_list=df_input['相对时间[s]'].values
+    Energy_list=df_input['累积能量[Kwh]'].values
+    for k in range(1,len(pos_list)):
+        latitude1=pos_list[k-1][0]
+        longitude1=pos_list[k-1][1]
+        latitude2=pos_list[k][0]
+        longitude2=pos_list[k][1]
+        dlt_odo=cal_dis_meters(6378.137,latitude1, longitude1,latitude2, longitude2)
+        df_gpsOnly.loc[index_list[k],'△距离1']=dlt_odo    
+        if time_list[index_list[k]]-time_list[index_list[k-1]]<60:#两次上传GPS数据时间间隔小于60sec
+            if df_gpsOnly.loc[index_list[k],'data_status']=='drive' :   
+                df_gpsOnly.loc[index_list[k],'△距离2']=dlt_odo
+            elif df_gpsOnly.loc[index_list[k],'data_status']=='none' :
+                df_gpsOnly.loc[index_list[k],'△距离2']=dlt_odo
+            else:
+                df_gpsOnly.loc[index_list[k],'△距离2']=0
+
+    #如果某一段数据中有gps数据但是没有bms数据,里程按照gps数据计算,但是到有gps数据之后,发现累积能量变化不大于0,因此需要将这期间的里程均设置为0km            
+    df_gpsOnly_copy=df_gpsOnly.copy()
+    df_gpsOnly_copy.index=[i for i in range(len(df_gpsOnly))]
+    df_bmsOnly=df_gpsOnly_copy[df_gpsOnly_copy['总电压[V]']>0]
+    energy2=df_bmsOnly['累积能量[Kwh]'].values
+    df_bmsOnly_index=df_bmsOnly.index.values
+    for k in range(1,len(df_bmsOnly)):
+        if not (energy2[k]-energy2[k-1]>0):
+            for n in range(df_bmsOnly_index[k-1],df_bmsOnly_index[k]+1):
+                df_gpsOnly_copy.loc[n,'△距离2']=0
+
+    dis2=df_gpsOnly_copy['△距离2'].values
+    relatedTime=df_gpsOnly_copy['相对时间[s]'].values
+    nan_flag=0
+
+    for k in range(1,len(dis2)):
+        if math.isnan(dis2[k]) and (not math.isnan(dis2[k-1])): #本次△距离2为NAN但是上次不为NAN
+            nan_flag=1
+            ###平均能耗计算
+            st_time=relatedTime[k]-600  #10min之前的时刻点
+            df2=df_gpsOnly_copy[df_gpsOnly_copy['相对时间[s]']>=st_time]
+            df_temp2=df2[df2['相对时间[s]']<=relatedTime[k]]
+            df_temp2=df_temp2[['相对时间[s]','累积能量[Kwh]','△距离2']]
+            df_temp3=df_temp2.dropna(axis=0,how='any') 
+            if len(df_temp3)>5:
+                # st_time=relatedTime[k-1]-600  #10min之前的时刻点
+                # df2=df_gpsOnly_copy[df_gpsOnly_copy['相对时间[s]']>=st_time]
+                # df_temp2=df2[df2['相对时间[s]']<=relatedTime[k]]
+                
+                energy=df_temp3['累积能量[Kwh]'].values
+                dis_temp=df_temp3['△距离2'].values
+                # dis_temp_delet_nan=dis_temp[np.logical_not(np.isnan(dis_temp))]
+                df_gpsOnly_copy.loc[k,'△能量[Kwh]']=energy[-1]-energy[0]
+                df_gpsOnly_copy.loc[k,'累积距离[km]']=dis_temp[1:-1].sum()
+                if energy[-1]-energy[0]>0:
+                    df_gpsOnly_copy.loc[k,'能耗[km/kwh]']=min(max(df_gpsOnly_copy.loc[k,'累积距离[km]']/df_gpsOnly_copy.loc[k,'△能量[Kwh]'],25),50)
+                else:
+                    if dis_temp[1:-1].sum()>0:
+                        df_gpsOnly_copy.loc[k,'能耗[km/kwh]']=30
+                    else:
+                        df_gpsOnly_copy.loc[k,'能耗[km/kwh]']=0
+            else:
+                df_temp2=df_gpsOnly_copy[df_gpsOnly_copy['相对时间[s]']<=relatedTime[k]]
+                df_energyPerKm=df_gpsOnly_copy[df_gpsOnly_copy['能耗[km/kwh]']>0]
+                df_energyPerKm.index=[i for i in range(len(df_energyPerKm))]
+                total_num=len(df_energyPerKm)
+                #统计最近10次的平均能耗,用于补充dis2前后都为nan时刻处的能耗及距离,
+                ##如果不足10次按照实际次数统计
+                if total_num>10:
+                    energycost_acc=0
+                    for i in range(10):
+                        energycost_acc=energycost_acc+df_energyPerKm.loc[total_num-i-1,'能耗[km/kwh]']
+                    avg_energyCost=min(max(energycost_acc/10,25),50)
+                    df_gpsOnly_copy.loc[k,'△能量[Kwh]']=1
+                    df_gpsOnly_copy.loc[k,'累积距离[km]']=avg_energyCost
+                    df_gpsOnly_copy.loc[k,'能耗[km/kwh]']=avg_energyCost
+                elif total_num>0:
+                    avg_energyCost=min(max(df_energyPerKm['能耗[km/kwh]'].values.mean(),25),50)
+                    df_gpsOnly_copy.loc[k,'△能量[Kwh]']=1
+                    df_gpsOnly_copy.loc[k,'累积距离[km]']=avg_energyCost
+                    df_gpsOnly_copy.loc[k,'能耗[km/kwh]']=avg_energyCost
+                else:
+                    df_gpsOnly_copy.loc[k,'△能量[Kwh]']=df_gpsOnly_copy.loc[k-1,'△能量[Kwh]'] 
+                    df_gpsOnly_copy.loc[k,'累积距离[km]']=df_gpsOnly_copy.loc[k-1,'累积距离[km]']
+                    df_gpsOnly_copy.loc[k,'能耗[km/kwh]']=df_gpsOnly_copy.loc[k-1,'能耗[km/kwh]']
+                
+            
+            ####行驶里程估计
+            energy1=df_temp2['累积能量[Kwh]'].values
+            if energy1[-1]-energy1[-2]>0:
+                gps_dis=df_gpsOnly_copy.loc[k,'△距离1']
+                delta_t=df_gpsOnly_copy.loc[k,'相对时间[s]']-df_gpsOnly_copy.loc[k-1,'相对时间[s]']
+                vehspd=gps_dis*3600/delta_t
+                if vehspd>30:
+                    df_gpsOnly_copy.loc[k,'△距离3[km]']=(energy1[-1]-energy1[-2])*df_gpsOnly_copy.loc[k,'能耗[km/kwh]']
+                else:
+                    df_gpsOnly_copy.loc[k,'△距离3[km]']=max((energy1[-1]-energy1[-2])*df_gpsOnly_copy.loc[k,'能耗[km/kwh]'],gps_dis)
+            else:
+                df_gpsOnly_copy.loc[k,'△距离3[km]']=0
+
+            df_gpsOnly_copy.loc[k,'△距离2']=df_gpsOnly_copy.loc[k,'△距离3[km]']
+            
+        elif math.isnan(dis2[k]) and (math.isnan(dis2[k-1])) and nan_flag==1: #本次△距离为NAN上次也为NAN
+            df_energyPerKm=df_gpsOnly_copy[df_gpsOnly_copy['能耗[km/kwh]']>0]
+            df_energyPerKm.index=[i for i in range(len(df_energyPerKm))]
+            total_num=len(df_energyPerKm)
+            #统计最近10次的平均能耗,用于补充dis2前后都为nan时刻处的能耗及距离,
+            ##如果不足10次按照实际次数统计
+            if total_num>10:
+                energycost_acc=0
+                for i in range(10):
+                    energycost_acc=energycost_acc+df_energyPerKm.loc[total_num-i-1,'能耗[km/kwh]']
+                avg_energyCost=min(max(energycost_acc/10,25),50)
+                df_gpsOnly_copy.loc[k,'△能量[Kwh]']=1
+                df_gpsOnly_copy.loc[k,'累积距离[km]']=avg_energyCost
+                df_gpsOnly_copy.loc[k,'能耗[km/kwh]']=avg_energyCost
+            elif total_num>0:
+                avg_energyCost=min(max(df_energyPerKm['能耗[km/kwh]'].values.mean(),25),50)
+                df_gpsOnly_copy.loc[k,'△能量[Kwh]']=1
+                df_gpsOnly_copy.loc[k,'累积距离[km]']=avg_energyCost
+                df_gpsOnly_copy.loc[k,'能耗[km/kwh]']=avg_energyCost
+            else:
+                df_gpsOnly_copy.loc[k,'△能量[Kwh]']=df_gpsOnly_copy.loc[k-1,'△能量[Kwh]'] 
+                df_gpsOnly_copy.loc[k,'累积距离[km]']=df_gpsOnly_copy.loc[k-1,'累积距离[km]']
+                df_gpsOnly_copy.loc[k,'能耗[km/kwh]']=df_gpsOnly_copy.loc[k-1,'能耗[km/kwh]']
+            
+            ##计算行驶里程
+            delta_energy=df_gpsOnly_copy.loc[k,'累积能量[Kwh]']-df_gpsOnly_copy.loc[k-1,'累积能量[Kwh]']
+            if delta_energy>0:
+                gps_dis=df_gpsOnly_copy.loc[k,'△距离1']
+                delta_t=df_gpsOnly_copy.loc[k,'相对时间[s]']-df_gpsOnly_copy.loc[k-1,'相对时间[s]']
+                vehspd=gps_dis*3600/delta_t
+                if vehspd>30:
+                    df_gpsOnly_copy.loc[k,'△距离3[km]']=delta_energy*df_gpsOnly_copy.loc[k,'累积距离[km]']/df_gpsOnly_copy.loc[k,'△能量[Kwh]']
+                else:
+                    df_gpsOnly_copy.loc[k,'△距离3[km]']=max(delta_energy*df_gpsOnly_copy.loc[k,'累积距离[km]']/df_gpsOnly_copy.loc[k,'△能量[Kwh]'],gps_dis)
+            else:
+                df_gpsOnly_copy.loc[k,'△距离3[km]']=0
+            
+            df_gpsOnly_copy.loc[k,'△距离2']=df_gpsOnly_copy.loc[k,'△距离3[km]']
+        else:
+            df_gpsOnly_copy.loc[k,'△能量[Kwh]']=1
+            df_gpsOnly_copy.loc[k,'累积距离[km]']=25
+            df_gpsOnly_copy.loc[k,'能耗[km/kwh]']=25
+            df_gpsOnly_copy.loc[k,'△距离3[km]']=df_gpsOnly_copy.loc[k,'△距离2']
+
+    ###############输出计算结果##################
+    ############################################
+    df_gpsOnly_copy.loc[0,'累积里程[km]']=0
+    df_gpsOnly_copy.loc[0,'日期']=str(df_gpsOnly_copy.loc[0,'时间戳'])[0:10]  
+
+    for k in range(1,len(df_gpsOnly_copy)):
+        df_dis_temp=df_gpsOnly_copy['△距离3[km]'].values[0:k+1]
+        df_dis_temp1=df_dis_temp[np.logical_not(np.isnan(df_dis_temp))]
+        if len(df_dis_temp1)>0:
+            df_gpsOnly_copy.loc[k,'累积里程[km]']=df_dis_temp1.sum()
+        else:
+            df_gpsOnly_copy.loc[k,'累积里程[km]']=df_gpsOnly_copy.loc[k-1,'累积里程[km]']
+        df_gpsOnly_copy.loc[k,'日期']=str(df_gpsOnly_copy.loc[k,'时间戳'])[0:10] 
+
+    datetime1=np.unique(df_gpsOnly_copy['日期'].values)
+    df_result=pd.DataFrame(index=datetime1)
+    list_result=[]
+    list_day_odo=[]
+
+    for k in range(len(datetime1)):
+        df_day=df_gpsOnly_copy[df_gpsOnly_copy['日期']==datetime1[k]]
+        odo_day=df_day['累积里程[km]'].values
+        df_result.loc[datetime1[k],'累积里程[km]']=odo_day[-1]-odo_day[0]
+        df_day['累积里程[km]']=odo_day-odo_day[0]
+        list_day_odo.extend(odo_day-odo_day[0])
+        list_result.append([datetime1[k],df_day])
+
+    df_gpsOnly_copy.loc[:,'每日累积里程[km]']=list_day_odo
+
+    #删除一些无用列,获取用于计算的数据
+    df_output=df_gpsOnly_copy[['时间戳','data_status','SOC[%]','每日累积里程[km]']]
+
+    #添加sn
+    df_output['sn'] = sn
+    return df_output
+