lmstack 3 年之前
父節點
當前提交
621c3f31d0

+ 0 - 127
LIB/FRONTEND/odo/CalDist.py

@@ -1,127 +0,0 @@
-from math import radians, cos, sin, asin, sqrt
-import pandas as pd
-import numpy as np
-from datetime import datetime
-from datetime import timedelta
-
-from GpsRank import *
-from ProcessDfBms import *
-from ProcessDfGps import *
-
-from LIB.BACKEND import DBManager
-
-import DBManager
-#####################################配置环境分割线#################################################
-
-def GetDistInfo(input_sn,input_starttime,input_endtime):
-
-    #####################################配置参数分割线#################################################
-    dbManager = DBManager.DBManager()
-    data_raw = dbManager.get_data(sn=input_sn, start_time=input_starttime, 
-        end_time=input_endtime)
-    #拆包预处理
-    df_bms_raw=data_raw['bms']
-    df_gps_raw=data_raw['gps']
-    df_bms=preprocess_Df_Bms(df_bms_raw)
-    df_gps=preprocess_Df_Gps(df_gps_raw)
-    
-    #####################################数据预处理分割线#################################################
-
-    # mode: 0:正常取数; 1:7255 取数
-    if input_sn[0:2] == 'UD' or input_sn[0:2] == 'MG':
-        mode = 1
-    else:
-        mode = 0
-    #获取状态表,mode默认为0,mode=1放电时电流为负,mode=0充电时电流为正
-
-    df_bms_drive_timetable=get_bms_drive_timetable(df_bms,mode)
-    df_gps_drive_cycle_accum=pd.DataFrame()
-    if len(df_bms_drive_timetable)>0:
-        for index in range(len(df_bms_drive_timetable)):
-            #筛选drivecycle数据
-            drive_start_time=df_bms_drive_timetable.loc[index,'drive_start_time']#开始时间
-            drive_end_time=df_bms_drive_timetable.loc[index,'drive_end_time']#结束时间
-
-            time_condition=(df_gps['time']>drive_start_time)&(df_gps['time']<drive_end_time)#时间判断条件
-            df_gps_drive_cycle=df_gps.loc[time_condition,:].copy()
-            df_gps_drive_cycle=df_gps_drive_cycle.reset_index(drop=True)#重置index
-            #计算drivecycle GPS累计里程,存入表格
-            condition_a=df_gps_drive_cycle['deltatime']>60*3
-            condition_b=(df_gps_drive_cycle['deltatime']>90*1)&(df_gps_drive_cycle['distance']>1000)
-            drive_cycle_dist_array=df_gps_drive_cycle.loc[~(condition_a|condition_b),'distance'].values
-            drive_cycle_dist_array=drive_cycle_dist_array[np.where((drive_cycle_dist_array>=1)&(drive_cycle_dist_array<1000))[0]]
-            gps_dist=drive_cycle_dist_array.sum()
-            df_bms_drive_timetable.loc[index,'gps_dist']=gps_dist#得到GPS路径
-            #计算头-尾的空缺时间段对应的预估SOC
-            if len(df_gps_drive_cycle)>2:
-                gps_starttime=df_gps_drive_cycle.loc[1,'time']#gps开始时间
-                gps_endtime=df_gps_drive_cycle.loc[df_gps_drive_cycle.index[-1],'time']#gps结束时间
-                #从drive_start_time到gps开始时间,使用SOC计算的里程
-                #gps结束时间到drive_end_time,使用SOC计算的里程
-                unrecorded_odo_head=cal_deltasoc(df_bms,drive_start_time,gps_starttime)
-                unrecorded_odo_tail=cal_deltasoc(df_bms,gps_endtime,drive_end_time)
-            else:
-                #计算数据丢失行unrecordeodo
-                unrecorded_odo_head=cal_deltasoc(df_bms,drive_start_time,drive_end_time)
-                unrecorded_odo_tail=0
-            #计算中间的预估SOC
-            predict_dist=cal_unrecorded_gps(df_gps_drive_cycle,df_bms)
-            #计算总的预估SOC
-            totaldist=predict_dist+unrecorded_odo_head+ unrecorded_odo_tail#得到GPS路径
-            df_bms_drive_timetable.loc[index,'predict_dist']=totaldist
-    else :
-        pass
-
-    #####################################统计行驶里程End#################################################
-    #打印输出结果#
-    index_list=list(range(len(df_bms_drive_timetable)))
-
-    dist_gps=0
-    dist_predict=0
-    day_start_time=''#当日开始时间
-    day_end_time=''#当日结束时间
-    day_start_soc=0#当日开始soc
-    day_end_soc=0#当日结束soc
-    day_min_soc=101#当日最低soc
-    drive_accum_soc=0#累计使用SOC
-
-    if len(df_bms_drive_timetable)>0:
-        #开始行
-        day_start_soc=df_bms_drive_timetable.loc[1,'drive_start_soc']#开始soc
-        day_start_time=df_bms_drive_timetable.loc[1,'drive_start_time']#开始时间
-        #结束行
-        day_end_time=df_bms_drive_timetable.loc[len(df_bms_drive_timetable)-1,'drive_end_time']#结束时间
-        day_end_soc=df_bms_drive_timetable.loc[len(df_bms_drive_timetable)-1,'drive_end_soc']#结束soc
-
-    for index in index_list:
-        '''汇总里程'''
-        dist_gps+=df_bms_drive_timetable.loc[index,'gps_dist']/1000#计算GPS里程
-        dist_predict+=df_bms_drive_timetable.loc[index,'predict_dist']#计算预估里程
-        drive_start_soc=df_bms_drive_timetable.loc[index,'drive_start_soc']#驾驶周期开始的soc
-        drive_end_soc=df_bms_drive_timetable.loc[index,'drive_end_soc']#驾驶周期结束的soc
-        day_min_soc=min(day_min_soc,drive_start_soc,drive_end_soc)
-
-        delta_soc=drive_start_soc-drive_end_soc#驾驶周期SOC变化量
-        drive_accum_soc+=abs(delta_soc)#所有drive cycle累计消耗的soc
-
-    # gps_score=get_df_gps_score(input_starttime,input_endtime,df_gps)
-    # gps_score=round(gps_score,1)
-    #计算总里程
-    dist_gps=round(dist_gps,3)
-    dist_predict=round(dist_predict,3)
-    dist_all=round(dist_gps+dist_predict,3)
-    #输出统计结果
-    # print ('为您查询到,从'+input_starttime+'到'+input_endtime+'时间段内:')
-    # print('SOC变化量:'+str(df_bms['bmspacksoc'].max()-df_bms['bmspacksoc'].min())+' %')
-    # print('行驶总里程:'+str(dist_all)+' km')
-
-    return {'SN':input_sn,'range':dist_all,'accum_soc':drive_accum_soc,'day_start_soc':day_start_soc,
-    'day_end_soc':day_end_soc,'day_start_time':day_start_time,'day_end_time':day_end_time,
-    'day_min_soc':day_min_soc}
-    # print('其中GPS信号在线时里程:'+str(dist_gps)+' km')
-    # print('其中GPS信号掉线时预估里程:'+str(dist_predict)+' km')
-    # print('GPS信号质量评分为:'+str(gps_score),'分\n')
-
-    #####################################打印结果End#################################################
-
-

+ 0 - 68
LIB/FRONTEND/odo/CalDist_Batch.py

@@ -1,68 +0,0 @@
-from math import radians, cos, sin, asin, sqrt
-import pandas as pd
-import numpy as np
-from datetime import datetime
-from datetime import timedelta
-
-from GpsRank import *
-from ProcessDfBms import *
-from ProcessDfGps import *
-from CalDist import *
-from LIB.BACKEND import DBManager
-import pdb
-
-asset_table_path='D:\\work\\Qixiang\\data_analyze_platform\\pengmin\\AllCarDist\\asset_table.xlsx'
-drive_info_path='D:\\work\\Qixiang\\data_analyze_platform\\pengmin\\AllCarDist\\drive_info.xlsx'
-asset_sheet_num=1
-usecols_list=[4,5]
-
-asset_table=pd.read_excel(asset_table_path,sheet_name=asset_sheet_num,skiprows=1,usecols=usecols_list)
-SN_list=asset_table['SN号'].values.tolist()
-print('从6060sheet读取到:'+str(len(SN_list))+'行')
-asset_table=asset_table.rename(columns={'SN号':'SN','状态':'state'})
-
-asset_table.set_index(["SN"],inplace=True)
-col_name=asset_table.columns.tolist()
-col_name.extend(['range','accum_soc','day_start_soc','day_end_soc','day_start_time','day_end_time'])
-asset_table=asset_table.reindex(columns=col_name)
-
-start_hour='00:00:00'#每日查询最早时间
-end_hour='23:59:00'#每日查询最晚时间
-
-
-date_index=pd.date_range('2021-07-31','2021-07-31')
-for date in date_index:
-    '''遍历日期'''
-
-    str_date=str(date)[:10]
-    input_starttime=str_date+' '+start_hour
-    input_endtime=str_date+' '+end_hour
-    test_day=str_date[5:10]#月-日,用于建立sheet
-    drive_info_path='D:\\work\\Qixiang\\data_analyze_platform\\pengmin\\AllCarDist\\6060\\drive_info'+test_day+'_50_end_'+'.xlsx'
-
-    print(input_starttime)
-
-    drive_info_aday=pd.DataFrame()
-    SN_list_short=SN_list#先选择了0:50,50:end
-
-    for SN in SN_list_short:
-        '''遍历SN号'''
-        SN=SN.strip('\t')
-        SN=SN.strip('\n')
-
-        try:
-            range=GetDistInfo(SN,input_starttime,input_endtime)
-            range_df=pd.DataFrame([range])
-            drive_info_aday=pd.concat([drive_info_aday,range_df],axis=0)
-
-        except:
-            print(SN+' '+test_day+'fail')
-        else:
-            pass
-            #print(SN+' '+test_day+'success')
-
-    drive_info_aday.to_excel(drive_info_path,sheet_name=test_day)#sheet名称为testday
-    
-    
-
-

+ 0 - 77
LIB/FRONTEND/odo/GpsRank.py

@@ -1,77 +0,0 @@
-import pandas as pd
-import numpy as np
-from datetime import datetime
-from datetime import timedelta
-
-def cal_gps_score(df):
-    '''在获取信号,优、良、合格、掉线的比例之后,计算gps的总评分'''
-    score=0
-    for index in range(len(df)):
-        time_percent=df.loc[index,'累计时间占比']
-        if df.loc[index,'GPS质量']=='优':
-            score+=time_percent*0
-        elif df.loc[index,'GPS质量']=='良':
-            score+=time_percent*0.3
-        elif df.loc[index,'GPS质量']=='合格':
-            score+=time_percent*0.5
-        elif df.loc[index,'GPS质量']=='掉线':
-            score+=time_percent*1
-    return (1-score)*100
-
-def gps_rank(df_gps_signal_table,df_gps,signal_rank,dist_factor):
-    '''gps信号质量分析函数,需要输入表格,df_gps,信号等级,权重'''
-    gps_signal_condition=(df_gps['gps_signal']==signal_rank)
-    dist=df_gps.loc[gps_signal_condition,'distance'].values.sum()
-    deltatime=df_gps.loc[gps_signal_condition,'deltatime'].values.sum()
-    df_gps_signal_table_condition=(df_gps_signal_table['gps_signal']==signal_rank)
-    df_gps_signal_table.loc[df_gps_signal_table_condition,'accum_distance']=dist/1000
-    df_gps_signal_table.loc[df_gps_signal_table_condition,'accum_deltatime']=deltatime
-    df_gps_signal_table.loc[df_gps_signal_table_condition,'accum_distance_factor']=dist/1000*dist_factor
-    return df_gps_signal_table
-
-def get_df_gps_score(starttime,endtime,df_gps):
-    '''对df_gps中的gps质量进行评分,返回一个数值'''
-    test_start_time=starttime#'2021-05-29 17:16:39'
-    test_end_time=endtime#'2021-05-29 20:08:08'
-
-    test_time_condition=(df_gps['time']>test_start_time)&(df_gps['time']<test_end_time)
-    df_gps_test=df_gps.loc[test_time_condition,:].copy()
-    df_gps_test=df_gps_test.reset_index(drop=True)#重置index
-    #按照deltatime打标签
-    gps_deltatime_bins=[0,30,60,120,10000]#优-良-合格-掉线
-    name=['优','良','合格','掉线']
-    df_gps_test['gps_signal']=pd.cut(df_gps_test['deltatime'], gps_deltatime_bins,labels=name)
-    df_gps_test['gps_signal'].value_counts()
-    #声明一个gps信号按类别统计table
-    df_gps_signal_table=pd.DataFrame()
-    df_gps_signal_table['gps_signal']=df_gps_test['gps_signal'].value_counts().index.tolist()
-    df_gps_signal_table['num']=df_gps_test['gps_signal'].value_counts().values.tolist()
-
-    #分类进行统计
-    df_gps_signal_table=gps_rank(df_gps_signal_table,df_gps_test,'优',1.00)
-    df_gps_signal_table=gps_rank(df_gps_signal_table,df_gps_test,'良',1.05)
-    df_gps_signal_table=gps_rank(df_gps_signal_table,df_gps_test,'合格',1.2)
-    df_gps_signal_table=gps_rank(df_gps_signal_table,df_gps_test,'掉线',1)
-
-    #次数占比,时间占比
-    all_num=df_gps_signal_table['num'].sum()
-    df_gps_signal_table['num_percent']=df_gps_signal_table['num']/all_num
-    all_accum_deltatime=df_gps_signal_table['accum_deltatime'].sum()
-    df_gps_signal_table['accum_deltatime_percent']=df_gps_signal_table['accum_deltatime']/all_accum_deltatime
-
-    #选择参数
-    df_gps_signal_table=df_gps_signal_table[['gps_signal','num','num_percent','accum_distance',
-                                            'accum_distance_factor','accum_deltatime','accum_deltatime_percent']]
-    df_gps_signal_table=df_gps_signal_table.rename(columns={'gps_signal':'GPS质量','num':'数量','num_percent':'数量占比',
-                                                        'accum_distance':'累计里程','accum_distance_factor':'累计里程修正值',
-                                                        'accum_deltatime':'累计时间','accum_deltatime_percent':'累计时间占比'})
-
-    df_gps_signal_table.loc[:,['GPS质量','累计时间','累计时间占比']]
-    gps_score=cal_gps_score(df_gps_signal_table)#调用函数计算gps评分
-    
-    #输出结果,评分
-    #print('From '+test_start_time+'  to '+test_end_time)
-    #print('GPS信号质量评分:'+str(gps_score))
-
-    return gps_score
-

+ 0 - 159
LIB/FRONTEND/odo/ProcessDfBms.py

@@ -1,159 +0,0 @@
-import pandas as pd
-import numpy as np
-from datetime import datetime
-from datetime import timedelta
-
-def get_bms_drive_timetable(df_bms,battery_mode):
-    '''对df_bms进行处理,得到行车的时间表。'''
-
-    #####################step1 先使用电流做充电状态的判断#############################################
-    if battery_mode==0:#mode=0,电流为正代表放电
-        condition_chrg=df_bms['bmspackcrnt']<0##根据电流,挑选充电状态
-        df_bms.loc[condition_chrg,'bscsta']='chrg'
-        condition_drive=df_bms['bmspackcrnt']>0.01##根据电流,挑选行驶状态
-        df_bms.loc[condition_drive,'bscsta']='drive'
-        df_bms.loc[~(condition_drive|condition_chrg),'bscsta']='idle'#静置状态
-    else :#mode=1,电流为负代表放电
-        condition_chrg=df_bms['bmspackcrnt']>0##根据电流,挑选充电状态
-        df_bms.loc[condition_chrg,'bscsta']='chrg'
-        condition_drive=df_bms['bmspackcrnt']<-0.01##根据电流,挑选行驶状态
-        df_bms.loc[condition_drive,'bscsta']='drive'
-        df_bms.loc[~(condition_drive|condition_chrg),'bscsta']='idle'#静置状态
-
-    #####################step2 对drive进行debounce,进入时立即进入,退出时debounce,5分钟。##########
-    index=0
-    debounce_row=10#debounce判断持续10行
-    debounce_time=300#debounce判断持续300秒
-    #对上一步初步状态进行二次处理
-    while index<(len(df_bms)-debounce_row):
-        mode_0=df_bms.loc[index,'bscsta']
-        mode_1=df_bms.loc[index+1,'bscsta']
-        #如果发现了边界行,则进行debounce判断
-        if (mode_0=='drive')&(mode_1!='drive'):#如果从drive变为idle
-            accum_subtime=0#累计时间初始化
-
-            for sub_index in range(debounce_row):#往下处理10行
-                sub_time=df_bms.loc[index+sub_index,'deltatime']
-                accum_subtime+=sub_time
-                #如果累计时间不到300秒,则设置为drive
-                if accum_subtime<debounce_time:
-                    df_bms.loc[index+sub_index,'bscsta']='drive'
-            index=index+debounce_row#处理10行以后的数据
-        #如果从idle变为drivemode,则将idle变为drive,包容前一行
-        elif (mode_0!='drive')&(mode_1=='drive'): 
-            df_bms.loc[index,'bscsta']='drive'
-            index=index+1
-        else:
-            index=index+1
-
-
-    #######################step3 对drivemode的时间进行分段###########################################
-    not_drive_flg=0#初始化
-    #输出drivemode的时间段,包含开始时间、结束时间
-    df_bms_drive_timetable_index=0
-    df_bms_drive_timetable=pd.DataFrame([],columns={'drive_start_time','drive_end_time',
-                                                    'gps_dist','predict_dist','drive_start_soc','drive_end_soc'})
-    for index in range(len(df_bms)):
-        temp_bscsta=df_bms.loc[index,'bscsta']
-        
-        if (temp_bscsta=='drive')&(not_drive_flg==0):
-            drive_start_time=df_bms.loc[index,'time']
-            not_drive_flg=1
-            df_bms_drive_timetable.loc[df_bms_drive_timetable_index,'drive_start_time']=drive_start_time
-            #startsoc
-            drive_start_soc=df_bms.loc[index,'bmspacksoc']
-            df_bms_drive_timetable.loc[df_bms_drive_timetable_index,'drive_start_soc']=drive_start_soc
-
-        elif (temp_bscsta!='drive')&(not_drive_flg==1):
-            drive_end_time=df_bms.loc[index,'time']
-            not_drive_flg=0
-            df_bms_drive_timetable.loc[df_bms_drive_timetable_index,'drive_end_time']=drive_end_time
-            #endsoc
-            drive_end_soc=df_bms.loc[index,'bmspacksoc']
-            df_bms_drive_timetable.loc[df_bms_drive_timetable_index,'drive_end_soc']=drive_end_soc
-            df_bms_drive_timetable_index+=1#index++
-
-    #删除时间信息不齐全的行
-    df_bms_drive_timetable=df_bms_drive_timetable.dropna(subset=['drive_end_time','drive_start_time'])
-    
-    return df_bms_drive_timetable
-
-
-def read_df_bms(path):
-    '''从路径中读取df_bms,进行预处理'''
-    df_bms=pd.read_csv(path, encoding='gbk')#编码方式gbk
-    #筛选表头,重命名
-    bms_columns=['时间戳','总电流[A]','总电压[V]','SOC[%]']
-    df_bms=df_bms.loc[:,bms_columns].copy()
-    df_bms.rename(columns = {"时间戳": "time", "总电流[A]": "bmspackcrnt", 
-                             "总电压[V]": "bmspackvol", "SOC[%]": "bmspacksoc"},inplace=True)#表头替换
-    #时间格式调整
-    df_bms['time']=df_bms['time'].apply(lambda x:datetime.strptime(x,'%Y-%m-%d %H:%M:%S'))#时间格式调整
-    #进行预处理
-    df_bms=df_add_deltatime(df_bms)#增加deltatime列 
-    return df_bms
-
-def preprocess_Df_Bms(df_bms):
-    '''对获得的df_bms,进行预处理'''
-    #筛选表头,重命名
-    bms_columns=['时间戳','总电流[A]','总电压[V]','SOC[%]']
-    df_bms=df_bms.loc[:,bms_columns].copy()
-    df_bms.rename(columns = {"时间戳": "time", "总电流[A]": "bmspackcrnt", 
-                             "总电压[V]": "bmspackvol", "SOC[%]": "bmspacksoc"},inplace=True)#表头替换
-    #删除空行
-    df_bms=df_bms.dropna(subset=['time'])
-    #删除时间重复的行,保留第一次出现的行
-    df_bms=df_bms.drop_duplicates(subset=['time'],keep='first')
-    #时间格式调整
-    df_bms['time']=df_bms['time'].apply(lambda x:datetime.strptime(x,'%Y-%m-%d %H:%M:%S'))#时间格式调整
-    #进行预处理
-    df_bms=df_add_deltatime(df_bms)#增加deltatime列 
-    return df_bms
-
-
-def df_add_deltatime(df_in):
-    '''Add a columns:deltatime,input df must have time column.'''
-    for i in range(len(df_in)):
-        #首行默认为0
-        if i==0:
-            df_in.loc[i,'deltatime']=0
-        #从第二行开始,计算i行到i-1行,GPS距离之差
-        else:
-            time1=df_in.loc[i-1,'time']
-            time2=df_in.loc[i,'time']
-            deltatime=time_interval(time1,time2)#计算时间差,返回单位为秒。
-            df_in.loc[i,'deltatime']=deltatime
-    return df_in
-
-
-def time_interval(time1,time2):
-    """
-    Calculate the time interval between two times,
-    return the seconds
-    """
-    deltatime=time2-time1
-    return deltatime.seconds
-
-
-def cal_deltasoc(df_bms,start_time,end_time):
-    '''输入开始时间和结束时间,返回deltasoc,此处将deltasoc*1既等效为unrecorded_odo.'''
-    time_condition=(df_bms['time']>start_time)&(df_bms['time']<end_time)
-    df_bms_sub=df_bms.loc[time_condition,:].copy()
-    if len(df_bms_sub)>=2:
-        
-        df_bms_head=df_bms_sub.head(1).copy()#首行
-        df_bms_startsoc=df_bms_head['bmspacksoc'].values[0]
-        df_bms_tail=df_bms_sub.tail(1).copy()#尾行
-        df_bms_endsoc=df_bms_tail['bmspacksoc'].values[0]
-        delta_soc=df_bms_startsoc-df_bms_endsoc
-        
-        if delta_soc>0:
-            #如果df_bms出现时间不连续,则先计算deltasoc,deltasoc每变化1,续驶里程增加1,
-            unrecorded_odo=delta_soc*1
-            #print('From '+str(start_time)+' to  '+str(end_time)+' soc decrease:  '+str(delta_soc))
-        else:
-            unrecorded_odo=0#如果deltasoc不大于0,说明在充电,或者静置不动    
-    #如果行数少于2,无法计算
-    else:
-        unrecorded_odo=0
-    return unrecorded_odo

+ 0 - 139
LIB/FRONTEND/odo/ProcessDfGps.py

@@ -1,139 +0,0 @@
-import pandas as pd
-import numpy as np
-from datetime import datetime
-from datetime import timedelta
-from ProcessDfBms import *
-from math import radians, cos, sin, asin, sqrt
-
-def cal_unrecorded_gps(df_in,df_bms):
-    '''筛选出现gps时间断点的数据,用df_bms数据补齐,df_in为df_gps表格。'''
-    #未记录到的odo总和
-    accum_unrecorded_odo=0
-
-    #设置丢失的判断条件,获得信息丢失行的index
-    condition1=df_in['deltatime']>60*3#时间间隔大于3分钟。说明数据掉线了。
-    condition2=(df_in['deltatime']>90*1)&(df_in['distance']>1000)#时间间隔大于*分钟,且Distance间隔大于*,代表掉线了。
-    signal_start_list=df_in.loc[condition1|condition2,:].index.to_list()#信息丢失行
-    #如果第0行属于信息丢失行,则删除,因为需要index-1行
-    try:
-        signal_start_list.remove(0)
-    except:
-        pass
-    else:
-        pass
-    #筛选出所有GPS信号丢失,对应的开始时间-结束时间对。
-    if len(signal_start_list)>0:
-        signal_end_list=[num-1 for num in signal_start_list]#信息丢失行的前一行,此处可能如果是首行,可能会有bug。
-        pick_gps_list=[0]+signal_start_list+signal_end_list+[len(df_in)-1]#首行+尾行+信号开始行+信号结束行
-        pick_gps_list=sorted(pick_gps_list)#重新排序
-
-    #有出现信号断点的行,则进行以下计算。
-    if len(signal_start_list)>0:
-        #针对每个时间对,计算unrecorded odo
-        for start_time_index,end_time_index in zip(signal_start_list,signal_end_list):
-            last_end_time=df_in.loc[end_time_index,'time']
-            this_start_time=df_in.loc[start_time_index,'time']
-            #print('gps signal loss from: '+str(last_end_time)+'-to-'+str(this_start_time))
-            #使用cal_delatasoc计算预估里程
-            unrecorded_odo=cal_deltasoc(df_bms,last_end_time,this_start_time)
-            accum_unrecorded_odo+=unrecorded_odo
-        #print('accum_unrecorded_odo:'+str(accum_unrecorded_odo))
-    else:
-        pass
-    
-    return accum_unrecorded_odo
-
-
-def df_add_avgspeed(df_in):
-    '''Add a columns:avgspeed ,input df must have deltatime,distance column.'''
-    for i in range(len(df_in)):
-        #首行默认为0
-        if i==0:
-            df_in.loc[i,'avgspeed']=0
-        #从第二行开始,计算平均速度
-        else:
-            deltatime=df_in.loc[i,'deltatime']
-            distance=df_in.loc[i,'distance']
-            avgspeed=(distance/1000)/(deltatime/3600)
-            df_in.loc[i,'avgspeed']=avgspeed
-    return df_in
-
-
-def read_df_gps(path):
-    df_gps=pd.read_csv(path, encoding='gbk')#编码方式gbk
-    #重置表头
-    df_gps.rename(columns = {"时间戳": "time", "纬度":"lat", "经度":"lng", 
-                             "卫星数":"sat_num", "海拔m":"height","速度[km/h]":"speed"},  inplace=True)
-    #时间格式调整
-    df_gps['time']=pd.to_datetime(df_gps['time'])
-    #对gps进行清洗
-    df_gps=df_add_distance(df_gps)#增加distance列
-    condition=df_gps['distance']<20000#删除GPS漂移过远的点,可能为GPS错误值
-    df_gps=df_gps.loc[condition,:].copy()#删除condition中,avgspd过大的部分,很可能伴随着GPS的漂移。
-    df_gps=df_gps.reset_index(drop=True)#重置index
-    #进行预处理
-    df_gps=df_add_distance(df_gps)#增加distance列,再算一次distance
-    df_gps=df_add_deltatime(df_gps)#增加deltatime列
-    df_gps=df_add_avgspeed(df_gps)#增加avgspeed列
-
-    #df_gps.to_excel('df_gps.xlsx',sheet_name='Sheet1')
-    return df_gps
-
-def preprocess_Df_Gps(df_gps):
-    '''对Df_Gps进行预处理'''
-    #重置表头
-    df_gps.rename(columns = {"时间戳": "time", "纬度":"lat", "经度":"lng", 
-                             "卫星数":"sat_num", "海拔m":"height","速度[km/h]":"speed"},  inplace=True)
-    #删除含有空数据的行
-    df_gps=df_gps.dropna(subset=['time','lat','lng'])
-    #删除时间重复的行,保留第一次出现的行
-    df_gps=df_gps.drop_duplicates(subset=['time'],keep='first')
-    #时间格式调整
-    df_gps['time']=pd.to_datetime(df_gps['time'])
-    
-    #对gps进行清洗
-    df_gps=df_add_distance(df_gps)#增加distance列
-    condition=df_gps['distance']<20000#删除GPS漂移过远的点,可能为GPS错误值
-    df_gps=df_gps.loc[condition,:].copy()#删除condition中,avgspd过大的部分,很可能伴随着GPS的漂移。
-    df_gps=df_gps.reset_index(drop=True)#重置index
-    #进行预处理
-    df_gps=df_add_distance(df_gps)#增加distance列,再算一次distance
-    df_gps=df_add_deltatime(df_gps)#增加deltatime列
-    df_gps=df_gps.loc[df_gps['deltatime']>0.01,:].copy()#删除deltatime=0的列,两个时间戳相同,无法求速度。
-    df_gps=df_add_avgspeed(df_gps)#增加avgspeed列
-
-    #df_gps.to_excel('df_gps.xlsx',sheet_name='Sheet1')
-    return df_gps
-
-
-def df_add_distance(df_in):
-    '''Add a columns:distance,input df must have lng,lat columns.'''
-    for i in range(len(df_in)):
-        #首行默认为0
-        if i==0:
-            df_in.loc[i,'distance']=0
-        #从第二行开始,计算i行到i-1行,GPS距离之差
-        else:
-            lon1=df_in.loc[i-1,'lng']
-            lat1=df_in.loc[i-1,'lat']
-            lon2=df_in.loc[i,'lng']
-            lat2=df_in.loc[i,'lat']
-            distance=haversine(lon1,lat1,lon2,lat2)#haversine公式计算距离差
-            df_in.loc[i,'distance']=distance    
-    return df_in
-
-
-def haversine(lon1, lat1, lon2, lat2):
-    """
-    Calculate the great circle distance between two points 
-    on the earth (specified in decimal degrees)
-    """
-    # 将十进制度数转化为弧度
-    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
-    # haversine公式
-    dlon = lon2 - lon1 
-    dlat = lat2 - lat1 
-    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
-    c = 2 * asin(sqrt(a)) 
-    r = 6371 # 地球平均半径,单位为公里
-    return c * r * 1000

+ 0 - 293
LIB/FRONTEND/odo/UpdtFct.py

@@ -1,293 +0,0 @@
-import pandas as pd
-import pymysql
-from sqlalchemy import create_engine
-import datetime
-
-#建立引擎
-engine = create_engine(str(r"mysql+mysqldb://%s:" + '%s' + "@%s/%s") % ('root', 'pengmin', 'localhost', 'qixiangdb'))
-
-conn_qx = pymysql.connect(
-        host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com',
-        user='qx_cas',
-        password='Qx@123456',#Qx@123456
-        database='qx_cas',
-        charset='utf8'
-    )
-
-conn_local = pymysql.connect(
-        host='localhost',
-        user='root',
-        password='pengmin',
-        database='qixiangdb',
-        charset='utf8'
-    )
-
-def getNextSoc(start_soc):
-    '''输入当前的soc,寻找目标soc函数'''
-    if start_soc>80:
-        next_soc=80
-    elif start_soc>60:
-        next_soc=60
-    elif start_soc>40:
-        next_soc=40
-    elif start_soc>20:
-        next_soc=20
-    else:
-        next_soc=1
-    return next_soc
-
-def updtSnFct(sn_factor_df,end_soc,delta_range,range_soc):
-    '''输入当前的soc区间段,里程变量量,soc变化量,输出新的df
-    sn_factor_df为dataframe,delta_range单位为km,range_soc单位为km/persoc'''
-    if end_soc==80:
-        updtFctByCol(sn_factor_df,'a0',delta_range,range_soc)
-    elif end_soc==60:
-        updtFctByCol(sn_factor_df,'a1',delta_range,range_soc)
-    elif end_soc==40:
-        updtFctByCol(sn_factor_df,'a2',delta_range,range_soc)
-    elif end_soc==20:
-        updtFctByCol(sn_factor_df,'a3',delta_range,range_soc)
-    elif end_soc<20:
-        updtFctByCol(sn_factor_df,'a4',delta_range,range_soc)
-    return sn_factor_df
-
-def updtFctByCol(sn_factor_df,colmun_name,delta_range,range_soc):
-    '''更新制定列的factor,sn_factor_df为dataframe,新的系数更新到第一行。delta_range单位为km,
-    range_soc单位为km/persoc,默认按照100km更新续驶里程权重'''
-    range_soc_old=sn_factor_df.loc[0,colmun_name]#读取第0行的老factor
-    debounce_range=200#更新权重
-    new_factor=range_soc*((delta_range)/debounce_range)+range_soc_old*(1-(delta_range)/debounce_range)
-    #在第1行,存储新的factor
-    sn_factor_df.loc[1,colmun_name]=new_factor
-    return sn_factor_df
-
-def updtTodayFct(factor_input,sn_day_df):
-    '''更新今日的Factor***'''
-    sn_factor_df_last=factor_input
-    start_soc=sn_day_df.loc[0,'soc']
-    next_soc=getNextSoc(start_soc)
-    start_range=sn_day_df.loc[0,'vehodo']
-    sn=sn_day_df.loc[0,'name']
-
-    for index in range(len(sn_day_df)-1):
-    #寻找分割点,
-        index_soc=sn_day_df.loc[index,'soc']#当前行soc
-        next_index_soc=sn_day_df.loc[index+1,'soc']#下一行soc
-
-        if (index_soc>=next_soc)&(next_index_soc<next_soc):#当前行高,下一行低
-            delta_soc_tonext=start_soc-next_soc#两个距离点的soc差,单位为%
-            delta_range_tonext=sn_day_df.loc[index,'vehodo']-start_range#两个时间点的距离差,单位为m
-            delta_range_tonext_km=delta_range_tonext/1000#两个时间点的距离差,单位为km
-            range_soc_tonext=(delta_range_tonext/1000)/delta_soc_tonext#单位soc可行驶的公里数
-            print(sn+'start_soc: '+str(start_soc),'next_soc: '+str(next_soc),'delta_vehodo; '+str(round(delta_range_tonext_km,3))
-            +'km'+' range_soc:'+str(round(range_soc_tonext,3)))
-
-            if (delta_range_tonext_km)>1:
-                sn_factor_df_last=updtSnFct(sn_factor_df_last,next_soc,delta_range_tonext_km,range_soc_tonext)
-            
-            start_soc=next_index_soc#变更开始soc
-            next_soc=getNextSoc(start_soc)#变更结束soc
-            start_range=sn_day_df.loc[index+1,'vehodo']#变更开始里程    
-
-    return sn_factor_df_last
-
-def snDayDfPreProcess(sn_day_df):
-    '''预处理,判断是否在dirvemode,获取drivemode条件下的累计行驶距离。
-    增加delta_soc列,drive_flg列,vehodo列'''
-    sn_day_df=sn_day_df.reset_index(drop=True)#重置index
-    #增加列,计算delta_soc
-    for index in range(len(sn_day_df)):
-        if index==0:
-            sn_day_df.loc[index,'delta_soc']=0
-        else:
-            sn_day_df.loc[index,'delta_soc']=sn_day_df.loc[index,'soc']-sn_day_df.loc[index-1,'soc']
-    #增加列,判断是否在drive状态
-    drive_flg=False
-    accum_distance=0
-    for index in range(len(sn_day_df)):
-        if index==0:
-            sn_day_df.loc[index,'drive_status']=drive_flg
-            sn_day_df.loc[index,'vehodo']=0
-        else:
-            if (sn_day_df.loc[index,'delta_soc']<-0.1)|\
-                ((sn_day_df.loc[index,'delta_soc']<=0)&(sn_day_df.loc[index,'distance']>500)):#soc处于下降状态,说明在drive
-                drive_flg=True#置true
-            elif sn_day_df.loc[index,'delta_soc']>0.1:#soc处于上升状态,说明不在drive
-                drive_flg=False#置false
-                accum_distance=0#清零
-            sn_day_df.loc[index,'drive_flg']=drive_flg
-            accum_distance+=sn_day_df.loc[index,'distance']#对行驶里程进行累加
-            sn_day_df.loc[index,'vehodo']=accum_distance
-    #筛选所有的drive信息行
-    sn_day_drive_df=sn_day_df.loc[sn_day_df['drive_flg']==True,:]
-    sn_day_drive_df=sn_day_drive_df.reset_index(drop=True)#重置index
-    
-    return sn_day_drive_df 
-
-def updtAllSnFct(start_date,end_date):
-    '''计算开始时间到结束时间的,所有sn的factor'''
-    start_date_datetime=datetime.datetime.strptime(start_date,'%Y-%m-%d')#开始时间
-    end_date_datetime=datetime.datetime.strptime(end_date,'%Y-%m-%d')#开始时间
-    delta_day=(end_date_datetime-start_date_datetime).days#间隔天数
-    i=1
-    while i<=delta_day:
-        end_date=(start_date_datetime+datetime.timedelta(days=i)).strftime("%Y-%m-%d")
-        updtAllSnTodayFct(start_date,end_date)#调用函数
-        print('update all sn factor from '+start_date+" to "+end_date)
-        start_date=end_date
-        i+=1#自加
-
-def updtAllSnTodayFct(start_date,end_date):
-    ''''更新今天所有sn的factorx信息,start_date和end_date相隔一天。此处还可优化'''
-    start_date_str="'"+start_date+"'"
-    end_date_str="'"+end_date+"'"
-    sql_cmd="select * from drive_info where time between "+start_date_str+" and "+end_date_str+" and distance!=0;"
-    range_soc_df = pd.read_sql(sql_cmd, conn_qx)#使用read_sql方法查询qx数据库
-
-    #筛选出所有当日数据之后,筛选当日有更新的sn
-    today_sn_list=range_soc_df['name'].unique().tolist()#[:100]#先一次更新5个
-    #建立空的dataframe,用于承接所有更新的factor信息
-    today_sn_fct_df=pd.DataFrame([],columns=['sn','date','a0','a1','a2','a3','a4'])
-
-    for sn in today_sn_list:
-        #寻找factor_df,里面是否有sn号,如果没有sn对应信息,则新增信息。
-        sn_str="'"+sn+"'"
-        sql_cmd2="select sn,date,a0,a1,a2,a3,a4 from tb_sn_factor where date<"+start_date_str+" and sn="+sn_str
-        #此处可以限定每次查询的数量,例如不高于5行
-        factor_df=pd.read_sql(sql_cmd2, conn_local)#使用read_sql方法查询local数据库
-
-        #按照sn号和日期进行去重,避免运行时重复产生factor数据,保留第一次出现的行。
-        factor_df=factor_df.drop_duplicates(subset=['sn','date'],keep='first')
-
-        if len(factor_df)==0:
-            #如果没有搜索到factor历史数据,则声明一个新的进行初始化
-            start_date_datetime=datetime.datetime.strptime(start_date,'%Y-%m-%d')
-            yesterday=(start_date_datetime+datetime.timedelta(days=-1)).strftime("%Y-%m-%d")
-            #为sn申请一个新的factor,初始值为1
-            factor_df=pd.DataFrame({'sn':sn,'date':yesterday,'a0':[1],'a1':[1],'a2':[1],'a3':[1],'a4':[1]})
-        sn_factor_df=factor_df.loc[factor_df['sn']==sn,:]#筛选sn对应的factor
-        sn_factor_df=sn_factor_df.sort_values(by='date',ascending='True')#按照日期排序
-
-        sn_factor_df_last=sn_factor_df.tail(1).copy()#寻找最后一行,代表最近日期
-        sn_factor_df_last=sn_factor_df_last.append(sn_factor_df_last)#新增加一行,用于存储新的factor
-        sn_factor_df_last=sn_factor_df_last.reset_index(drop=True)#重置index
-        sn_factor_df_last.loc[1,'date']=start_date#更改后一行的date为当前日期
-        #筛选对应车辆的信息
-        condition_sn=(range_soc_df['name']==sn)
-        sn_day_df=range_soc_df.loc[condition_sn,:].copy()
-        sn_day_df=sn_day_df.reset_index(drop=True)
-        #使用updtTodayFct函数更新今天的factor
-        if len(sn_day_df)>=2:
-            #使用process函数,进行预处理
-            sn_day_df=snDayDfPreProcess(sn_day_df)#预处理函数
-            if len(sn_day_df)>=2:
-                sn_factor_df_new=updtTodayFct(sn_factor_df_last,sn_day_df)#
-                today_sn_fct_df=today_sn_fct_df.append(sn_factor_df_new.loc[1,:])#筛选第一行,进行拼接,最后写入到数据库中
-    
-    #将today_sn_fct_df写入到数据库中,今天所有factor更新的系数,一次写入。
-    if len(today_sn_fct_df)>=1:
-        today_sn_fct_df.to_sql('tb_sn_factor',con=engine,chunksize=10000,if_exists='append',index=False)
-
-def updtOneSnFct(sn,start_date,end_date):
-    '''计算开始时间到结束时间的,一个sn的所有factor'''
-    start_date_datetime=datetime.datetime.strptime(start_date,'%Y-%m-%d')#开始时间
-    end_date_datetime=datetime.datetime.strptime(end_date,'%Y-%m-%d')#开始时间
-    delta_day=(end_date_datetime-start_date_datetime).days#间隔天数
-    i=1
-    while i<=delta_day:
-        end_date=(start_date_datetime+datetime.timedelta(days=i)).strftime("%Y-%m-%d")
-        updtOneSnTodayFct(sn,start_date,end_date)#调用函数
-        print('update one sn factor from '+start_date+" to "+end_date)
-        start_date=end_date
-        i+=1#自加
-
-def updtOneSnTodayFct(sn,start_date,end_date):
-    start_date_str="'"+start_date+"'"
-    end_date_str="'"+end_date+"'"
-    sn_str="'"+sn+"'"
-    sql_cmd="select * from drive_info where time between "+start_date_str+" and "+end_date_str+\
-    " and distance!=0 and name="+sn_str
-    range_soc_df = pd.read_sql(sql_cmd, conn_qx)#使用read_sql方法查询qx数据库
-
-    if len(range_soc_df)>0:
-        #筛选出所有当日数据之后,筛选当日有更新的sn
-        today_sn_list=range_soc_df['name'].unique().tolist()
-        #建立空的dataframe,用于承接所有更新的factor信息
-        today_sn_fct_df=pd.DataFrame([],columns=['sn','date','a0','a1','a2','a3','a4'])
-
-        for sn in today_sn_list:
-            #寻找factor_df,里面是否有sn号,如果没有sn对应信息,则新增信息。
-            sn_str="'"+sn+"'"
-            sql_cmd2="select sn,date,a0,a1,a2,a3,a4 from tb_sn_factor where date<"+start_date_str+" and sn="+sn_str
-            factor_df=pd.read_sql(sql_cmd2, conn_local)#使用read_sql方法查询local数据库
-
-            #按照sn号和日期进行去重,避免运行时重复产生factor数据,保留第一次出现的行。
-            factor_df=factor_df.drop_duplicates(subset=['sn','date'],keep='first')
-
-            if len(factor_df)==0:
-                #如果没有搜索到factor历史数据,则声明一个新的进行初始化
-                start_date_datetime=datetime.datetime.strptime(start_date,'%Y-%m-%d')
-                yesterday=(start_date_datetime+datetime.timedelta(days=-1)).strftime("%Y-%m-%d")
-                factor_df=pd.DataFrame({'sn':sn,'date':yesterday,'a0':[1],'a1':[1],'a2':[1],'a3':[1],'a4':[1]})
-                today_sn_fct_df=today_sn_fct_df.append(factor_df.loc[0,:])#将初始化的行记录到数据库
-
-            sn_factor_df=factor_df.loc[factor_df['sn']==sn,:]#筛选sn对应的factor
-            
-            sn_factor_df=sn_factor_df.sort_values(by='date',ascending='True')#按照日期排序
-            sn_factor_df_last=sn_factor_df.tail(1).copy()#寻找最后一行,代表最近日期
-            sn_factor_df_last=sn_factor_df_last.append(sn_factor_df_last)#新增加一行,用于存储新的factor
-            sn_factor_df_last=sn_factor_df_last.reset_index(drop=True)#重置index
-            sn_factor_df_last.loc[1,'date']=start_date#更改后一行的date为当前日期
-            #筛选对应车辆的信息
-            condition_sn=(range_soc_df['name']==sn)
-            sn_day_df=range_soc_df.loc[condition_sn,:].copy()
-            sn_day_df=sn_day_df.reset_index(drop=True)
-            #使用updtTodayFct函数更新今天的factor
-            if len(sn_day_df)>=2:
-                #使用process函数,进行预处理
-                sn_day_df=snDayDfPreProcess(sn_day_df)#!!!!!!!!!!!增加
-                if len(sn_day_df)>=2:
-                    sn_factor_df_new=updtTodayFct(sn_factor_df_last,sn_day_df)#
-                    today_sn_fct_df=today_sn_fct_df.append(sn_factor_df_new.loc[1,:])#筛选第一行,进行拼接,最后写入到数据库中
-        
-        # #将today_sn_fct_df写入到数据库中
-        if len(today_sn_fct_df)>=1:
-            today_sn_fct_df.to_sql('tb_sn_factor',con=engine,chunksize=10000,if_exists='append',index=False)
-            # print(sn+' factor will be update in table tb_sn_factor!')
-        return today_sn_fct_df
-
-
-
-
-
-# def updtASnTodayFct(start_date,end_date,today_sn_list):
-
-#     sql_cmd="select * from qixiang_test where time>='"+start_date+"' and time<='"+end_date+"'"
-#     range_soc_df = pd.read_sql(sql_cmd, conn)#使用read_sql方法查询数据库
-
-#     sql_cmd2="select sn,date,a0,a1,a2,a3,a4 from tb_sn_factor where date<'"+start_date+"'"
-#     factor_df=pd.read_sql(sql_cmd2, conn)#使用read_sql方法查询数据库
-
-#     #筛选出所有当日数据之后,筛选当日有更新的sn
-#     # today_sn_list=range_soc_df['sn'].unique().tolist()
-#     # today_sn_list=today_sn_list[:10]#更新若干个
-#     #建立空的dataframe,用于承接所有更新的factor信息
-#     today_sn_fct_df=pd.DataFrame([],columns=['sn','date','a0','a1','a2','a3','a4'])
-
-#     for sn in today_sn_list:
-#         sn_factor_df=factor_df.loc[factor_df['sn']==sn,:]#筛选sn对应的factor
-#         sn_factor_df=sn_factor_df.sort_values(by='date',ascending='True')#按照日期排序
-#         sn_factor_df_last=sn_factor_df.tail(1).copy()#寻找最后一行,代表最近日期
-#         sn_factor_df_last=sn_factor_df_last.append(sn_factor_df_last)#新增加一行,用于存储新的factor
-#         sn_factor_df_last=sn_factor_df_last.reset_index(drop=True)#重置index
-#         sn_factor_df_last.loc[1,'date']=start_date#更改后一行的date为当前日期
-#         #筛选对应车辆的信息
-#         condition_sn=(range_soc_df['sn']==sn)
-#         sn_day_df=range_soc_df.loc[condition_sn,:].copy()
-#         sn_day_df=sn_day_df.reset_index(drop=True)
-#         #使用updtTodayFct函数更新今天的factor
-#         sn_factor_df_new=updtTodayFct(sn_factor_df_last,sn_day_df)
-#         today_sn_fct_df=today_sn_fct_df.append(sn_factor_df_new.loc[1,:])#筛选第一行,进行拼接,最后写入到数据库中
-    
-#     #将today_sn_fct_df写入到数据库中
-#     today_sn_fct_df.to_sql('tb_sn_factor',con=engine,chunksize=10000,if_exists='append',index=False)

+ 0 - 28
LIB/FRONTEND/odo/UpdtFct_Main.py

@@ -1,28 +0,0 @@
-import pandas as pd
-import pymysql
-from sqlalchemy import create_engine
-import datetime
-from UpdtFct import *
-
-
-conn_qx = pymysql.connect(
-        host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com',
-        user='qx_cas',
-        password='Qx@123456',#Qx@123456
-        database='qx_cas',
-        charset='utf8'
-    )
-
-conn_local = pymysql.connect(
-        host='localhost',
-        user='root',
-        password='pengmin',
-        database='qixiangdb',
-        charset='utf8'
-    )
-
-#指定开始时间,结束时间,更新所有sn的factor
-start_date="2021-07-18"
-end_date="2021-08-01"
-
-updtAllSnFct(start_date,end_date)

二進制
LIB/FRONTEND/odo/asset_table.xlsx


+ 0 - 0
LIB/FRONTEND/odo/create_table.py


+ 0 - 103
LIB/FRONTEND/odo/deploy.py

@@ -1,103 +0,0 @@
-#coding=utf-8
-# 计算里程
-from math import radians, cos, sin, asin, sqrt
-import pandas as pd
-import numpy as np
-from datetime import timedelta
-from sqlalchemy import create_engine
-from sqlalchemy.orm import sessionmaker
-from GpsRank import *
-from ProcessDfBms import *
-from ProcessDfGps import *
-from LIB.MIDDLE.odo.CalDist import *
-from LIB.BACKEND import DBManager, Log
-import pdb
-from urllib import parse
-import traceback
-import os
-import time, datetime
-import pymysql
-import dateutil.relativedelta
-
-if __name__ == "__main__":
-    
-    # 时间设置
-    now_time = datetime.datetime.now()
-    pre_time = now_time + dateutil.relativedelta.relativedelta(days=-1)
-    end_time=datetime.datetime.strftime(now_time,"%Y-%m-%d 00:00:00")
-    start_time=datetime.datetime.strftime(pre_time,"%Y-%m-%d 00:00:00")
-    
-    # end_time = "2021-08-13 00:00:00"
-    # start_time = "2019-01-01 00:00:00"
-    
-    # start_hour='00:00:00'#每日查询最早时间
-    # end_hour='23:59:00'#每日查询最晚时间
-    
-    # 更新sn列表
-    host='rm-bp10j10qy42bzy0q7.mysql.rds.aliyuncs.com'
-    port=3306
-    db='qixiang_oss'
-    user='qixiang_oss'
-    password='Qixiang2021'
-    conn = pymysql.connect(host=host, port=port, user=user, password=password, database=db)
-    cursor = conn.cursor()
-    cursor.execute("select sn, imei from app_device")
-    res = cursor.fetchall()
-    df_sn = pd.DataFrame(res, columns=['sn', 'imei'])
-    df_sn = df_sn.sort_values(['sn'])
-    df_sn = df_sn.reset_index(drop=True)
-    conn.close();
-    
-    # 结果数据库配置
-    host = 'rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
-    port = 3306
-    user = 'qx_cas'
-    password = parse.quote_plus('Qx@123456')
-    database = 'qx_cas'
-
-    db_engine = create_engine(
-        "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
-            user, password, host, port, database
-        ))
-    DbSession = sessionmaker(bind=db_engine)
-    
-    # 日志配置
-    now_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()).replace(":","_")
-    log_path = 'log/' + now_str
-    if not os.path.exists(log_path):
-        os.makedirs(log_path)
-    log = Log.Mylog(log_name='odo', log_level = 'info')
-    log.set_file_hl(file_name='{}/info.log'.format(log_path), log_level='info', size=1024* 1024 * 100)
-    log.set_file_hl(file_name='{}/error.log'.format(log_path), log_level='error', size=1024* 1024 * 100)
-    logger = log.get_logger()
-
-    logger.info("pid is + {}".format(os.getpid()))
-
-    # date_index=pd.date_range(start_time[:10], end_time[:10])
-    # for date in date_index:
-    #     '''遍历日期'''
-    input_starttime = start_time
-    input_endtime = end_time
-
-    drive_info_aday=pd.DataFrame()
-
-    for SN in df_sn['sn'].tolist()[1200:]:
-        '''遍历SN号'''
-        SN=SN.strip('\t')
-        SN=SN.strip('\n')
-        try:
-            logger.info("pid-{} {}---{} START!".format(os.getpid(), SN, str(input_starttime)))
-            range=GetDistInfo(SN,input_starttime,input_endtime)
-            range_df=pd.DataFrame([range])
-            drive_info_aday=pd.concat([drive_info_aday,range_df],axis=0)
-            logger.info("{}---{} DONE!".format(SN, str(input_starttime)))
-            if not drive_info_aday.empty:
-                drive_info_aday['time'] = input_starttime[0:10]
-                drive_info_aday.columns = ['sn', 'odo', 'accum_soc', 'start_soc', 'end_soc', 'start_time','end_time', 'min_soc', 'time']
-                drive_info_aday.to_sql("odo_result",con=db_engine, if_exists="append",index=False)
-        except Exception as e:
-            logger.error(traceback.format_exc)
-            logger.error(u"{} :{},{} 任务运行错误".format(SN,input_starttime,input_endtime), exc_info=True)
-
-
-    

+ 0 - 66
LIB/FRONTEND/odo/main_1.py

@@ -1,66 +0,0 @@
-#coding=utf-8
-# 计算里程
-from math import radians, cos, sin, asin, sqrt
-import pandas as pd
-import numpy as np
-from datetime import datetime
-from datetime import timedelta
-
-from GpsRank import *
-from ProcessDfBms import *
-from ProcessDfGps import *
-from LIB.MIDDLE.odo.CalDist import *
-from LIB.BACKEND import DBManager
-import pdb
-
-asset_table_path='asset_table.xlsx'
-# drive_info_path='D:\\work\\Qixiang\\data_analyze_platform\\pengmin\\AllCarDist\\drive_info.xlsx'
-asset_sheet_num=1
-usecols_list=[4,5]
-
-asset_table=pd.read_excel(asset_table_path,sheet_name=asset_sheet_num,skiprows=1,usecols=usecols_list)
-SN_list=asset_table['SN号'].values.tolist()
-print('从6060sheet读取到:'+str(len(SN_list))+'行')
-asset_table=asset_table.rename(columns={'SN号':'SN','状态':'state'})
-
-asset_table.set_index(["SN"],inplace=True)
-col_name=asset_table.columns.tolist()
-col_name.extend(['range','accum_soc','day_start_soc','day_end_soc','day_start_time','day_end_time'])
-asset_table=asset_table.reindex(columns=col_name)
-
-start_hour='00:00:00'#每日查询最早时间
-end_hour='23:59:00'#每日查询最晚时间
-
-
-date_index=pd.date_range('2021-07-31','2021-07-31')
-for date in date_index:
-    '''遍历日期'''
-
-    str_date=str(date)[:10]
-    input_starttime=str_date+' '+start_hour
-    input_endtime=str_date+' '+end_hour
-    test_day=str_date[5:10]#月-日,用于建立sheet
-    drive_info_path='6060\\drive_info'+test_day+'_50_end_'+'.xlsx'
-
-    print(input_starttime)
-
-    drive_info_aday=pd.DataFrame()
-    SN_list_short=SN_list#先选择了0:50,50:end
-
-    for SN in SN_list_short:
-        '''遍历SN号'''
-        SN=SN.strip('\t')
-        SN=SN.strip('\n')
-
-        try:
-            range=GetDistInfo(SN,input_starttime,input_endtime)
-            range_df=pd.DataFrame([range])
-            drive_info_aday=pd.concat([drive_info_aday,range_df],axis=0)
-
-        except:
-            print(SN+' '+test_day+'fail')
-        else:
-            pass
-            #print(SN+' '+test_day+'success')
-
-    drive_info_aday.to_excel(drive_info_path,sheet_name=test_day)#sheet名称为testday

+ 0 - 2
LIB/FRONTEND/odo/run.bat

@@ -1,2 +0,0 @@
-cd /d D:\deploy\python_platform\data_analyze_platform\LIB\FRONTEND\odo
-D:\env\py_pro\python.exe D:\deploy\python_platform\data_analyze_platform\LIB\FRONTEND\odo\deploy.py