|
@@ -75,7 +75,7 @@ class SignalMonitor():
|
|
|
return df_state
|
|
|
|
|
|
@staticmethod
|
|
|
- def _judge_offline_state_between_messages(sn, PackState_new, PackState_old, Timestamp_new, Timestamp_old, df_res, mode):
|
|
|
+ def _judge_offline_state_between_messages(sn, PackState_new, PackState_old, Timestamp_new, Timestamp_old, lat, long, df_res, mode):
|
|
|
delta_time = (Timestamp_new - Timestamp_old).total_seconds()
|
|
|
max_state = max(PackState_new, PackState_old)
|
|
|
if max_state == 0:
|
|
@@ -109,7 +109,7 @@ class SignalMonitor():
|
|
|
|
|
|
if LineState > 0:
|
|
|
df_res = df_res.append({'sn':sn[0], 'PackState':PackState_new*16+PackState_old, 'LineState':LineState, 'StartTime':Timestamp_old,
|
|
|
- 'EndTime':Timestamp_new, 'OfflineTime':delta_time}, ignore_index=True)
|
|
|
+ 'EndTime':Timestamp_new, 'OfflineTime':delta_time, 'latitude':lat, 'longitude':long}, ignore_index=True)
|
|
|
return LineState, df_res
|
|
|
|
|
|
@staticmethod
|
|
@@ -120,16 +120,19 @@ class SignalMonitor():
|
|
|
while index < len(df_state)-1:
|
|
|
index = index + 1
|
|
|
LineState, df_res = SignalMonitor._judge_offline_state_between_messages(sn, df_state.loc[index, 'PackState'], df_state.loc[index-1, 'PackState'],
|
|
|
- df_state.loc[index, 'Timestamp'], df_state.loc[index-1, 'Timestamp'], df_res, mode=mode)
|
|
|
+ df_state.loc[index, 'Timestamp'], df_state.loc[index-1, 'Timestamp'], df_state.loc[index-1, 'latitude'], df_state.loc[index-1, 'longitude'],
|
|
|
+ df_res, mode=mode)
|
|
|
df_state.loc[index, 'LineState'] = LineState
|
|
|
else:
|
|
|
df_last_info = df_last_state.loc[len(df_last_state) - 1]
|
|
|
df_state.loc[0,'LineState'], df_res = SignalMonitor._judge_offline_state_between_messages(sn, df_state.loc[0, 'PackState'], df_last_info['PackState'],
|
|
|
- df_state.loc[0, 'Timestamp'], df_last_info['Timestamp'], df_res, mode=mode)
|
|
|
+ df_state.loc[0, 'Timestamp'], df_last_info['Timestamp'], df_state.loc[0, 'latitude'], df_state.loc[0, 'longitude'],
|
|
|
+ df_res, mode=mode)
|
|
|
while index < len(df_state)-1:
|
|
|
index = index + 1
|
|
|
LineState, df_res = SignalMonitor._judge_offline_state_between_messages(sn, df_state.loc[index, 'PackState'], df_state.loc[index-1, 'PackState'],
|
|
|
- df_state.loc[index, 'Timestamp'], df_state.loc[index-1, 'Timestamp'], df_res, mode=mode)
|
|
|
+ df_state.loc[index, 'Timestamp'], df_state.loc[index-1, 'Timestamp'], df_state.loc[index-1, 'latitude'], df_state.loc[index-1, 'longitude'],
|
|
|
+ df_res, mode=mode)
|
|
|
df_state.loc[index, 'LineState'] = LineState
|
|
|
# SignalMonitor._file_write(r'D:\result_03.xls', df_state)
|
|
|
return df_res
|
|
@@ -137,22 +140,22 @@ class SignalMonitor():
|
|
|
@staticmethod
|
|
|
def _set_gps_working_states(df_state, df_state_gps):
|
|
|
for i in range(0, len(df_state_gps)):
|
|
|
- if df_state_gps.loc[i, 'Timestamp'] <= df_state.loc[0, 'Timestamp']:
|
|
|
- df_state_gps.loc[i, 'PackState'] = df_state.loc[0, 'PackState']
|
|
|
- elif df_state_gps.loc[i, 'Timestamp'] >= df_state.loc[len(df_state)-1, 'Timestamp']:
|
|
|
- df_state_gps.loc[i:len(df_state_gps)-1, 'PackState'] = df_state.loc[len(df_state)-1, 'PackState']
|
|
|
- break
|
|
|
+ if df_state_gps.loc[i, 'Timestamp'] <= df_state.loc[0, 'Timestamp']:
|
|
|
+ df_state_gps.loc[i, 'PackState'] = df_state.loc[0, 'PackState']
|
|
|
+ elif df_state_gps.loc[i, 'Timestamp'] >= df_state.loc[len(df_state)-1, 'Timestamp']:
|
|
|
+ df_state_gps.loc[i:len(df_state_gps)-1, 'PackState'] = df_state.loc[len(df_state)-1, 'PackState']
|
|
|
+ break
|
|
|
+ else:
|
|
|
+ index0 = max(df_state[df_state['Timestamp'] <= df_state_gps.loc[i, 'Timestamp']].index)
|
|
|
+ index1 = min(df_state[df_state['Timestamp'] >= df_state_gps.loc[i, 'Timestamp']].index)
|
|
|
+ front = (df_state_gps.loc[i, 'Timestamp'] - df_state.loc[index0, 'Timestamp']).total_seconds()
|
|
|
+ back = (df_state.loc[index1, 'Timestamp'] - df_state_gps.loc[i, 'Timestamp']).total_seconds()
|
|
|
+ if front > back:
|
|
|
+ df_state_gps.loc[i, 'PackState'] = df_state.loc[index1, 'PackState']
|
|
|
+ elif front == back:
|
|
|
+ df_state_gps.loc[i, 'PackState'] = max(df_state.loc[index1, 'PackState'], df_state.loc[index0, 'PackState'])
|
|
|
else:
|
|
|
- index0 = max(df_state[df_state['Timestamp'] <= df_state_gps.loc[i, 'Timestamp']].index)
|
|
|
- index1 = min(df_state[df_state['Timestamp'] >= df_state_gps.loc[i, 'Timestamp']].index)
|
|
|
- front = (df_state_gps.loc[i, 'Timestamp'] - df_state.loc[index0, 'Timestamp']).total_seconds()
|
|
|
- back = (df_state.loc[index1, 'Timestamp'] - df_state_gps.loc[i, 'Timestamp']).total_seconds()
|
|
|
- if front > back:
|
|
|
- df_state_gps.loc[i, 'PackState'] = df_state.loc[index1, 'PackState']
|
|
|
- elif front == back:
|
|
|
- df_state_gps.loc[i, 'PackState'] = max(df_state.loc[index1, 'PackState'], df_state.loc[index0, 'PackState'])
|
|
|
- else:
|
|
|
- df_state_gps.loc[i, 'PackState'] = df_state.loc[index0, 'PackState']
|
|
|
+ df_state_gps.loc[i, 'PackState'] = df_state.loc[index0, 'PackState']
|
|
|
return df_state_gps
|
|
|
|
|
|
@staticmethod
|
|
@@ -209,7 +212,7 @@ class SignalMonitor():
|
|
|
return df_res,df_state, df_last_state
|
|
|
|
|
|
def get_gps_offline_stat(self,sn, st, et, df_state, df_res_gps, df_last_state_gps, cal_Period=24): # 计算一段时间内GPS信号统计数据
|
|
|
- df_state_gps = pd.DataFrame(columns=['sn', 'Timestamp', 'PackState', 'LineState'])
|
|
|
+ df_state_gps = pd.DataFrame(columns=['sn', 'Timestamp', 'PackState', 'LineState', 'latitude', 'longitude'])
|
|
|
# print("start_time is {}, limit_time is {}".format(st, limit_time))
|
|
|
end_time = st + datetime.timedelta(hours=cal_Period) # 结束时间
|
|
|
start_time_str = st.strftime('%Y-%m-%d %H:%M:%S')
|
|
@@ -223,6 +226,9 @@ class SignalMonitor():
|
|
|
|
|
|
df_state_gps['Timestamp'] = df_gps['时间戳']
|
|
|
df_state_gps['sn'] = sn[0]
|
|
|
+ df_state_gps['latitude'] = df_gps['latitude']
|
|
|
+ df_state_gps['longitude'] = df_gps['longitude']
|
|
|
+
|
|
|
|
|
|
if len(df_state_gps) > 0: # 无数据则不计算
|
|
|
df_state_gps = SignalMonitor._set_gps_working_states(df_state, df_state_gps) # 根据同时间段内BMS状态计算GPS数据对应的BMS状态
|