day_sta.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. <<<<<<< HEAD
  2. __author__ = 'lmstack'
  3. # 每日指标统计函数
  4. import CONFIGURE.PathSetting as PathSetting
  5. import sys
  6. sys.path.append(PathSetting.backend_path)
  7. sys.path.append(PathSetting.middle_path)
  8. import DBManager
  9. import Tools
  10. import DataPreProcess
  11. import IndexStaByPeriod
  12. import Log
  13. import IndexStaByPeriod
  14. import importlib
  15. import datetime
  16. import os
  17. import pandas as pd
  18. import time
  19. importlib.reload(IndexStaByPeriod)
  20. dbManager = DBManager.DBManager()
  21. dataPrePro = DataPreProcess.DataPreProcess()
  22. indexPerSta = IndexStaByPeriod.IndexStaByPeriod()
  23. # log 文件配置
  24. myLog = Log.Mylog('day_sta')
  25. myLog.set_file_hl(file_name=r'D:\Platform\platform\FRONTEND\day_sta\day_sta.log', log_level='info')
  26. myLog.set_stream_hl(log_level='info')
  27. logger = myLog.get_logger()
  28. logger.info(str(os.getpid()))
  29. # sn文件读取
  30. sn_list = list(pd.read_excel('D:\Platform\platform\苏州电池列表.xlsx')['sn'])
  31. sn_list.extend(list(pd.read_excel('D:\Platform\platform\骑享北京6040电池包统计更新20210407.xlsx')['SN号']))
  32. sn = sn_list[0]
  33. # 字段设置及结果文件生成
  34. columns = ['sn', 'time', 'sumDriveTime', 'sumDriveSoc', 'sumDriveAh', 'sumDriveEnergy']
  35. st = datetime.datetime.strptime('00:00:00', '%H:%M:%S')
  36. for i in range(96):
  37. et = st + datetime.timedelta(minutes=15)
  38. columns.append(st.strftime('%H:%M') + '-' + et.strftime('%H:%M'))
  39. st = et
  40. result_path = r'D:\Platform\platform\FRONTEND\day_sta\result.csv'
  41. df_res = pd.DataFrame(columns=columns)
  42. if not os.path.exists(result_path):
  43. df_res.to_csv(result_path, index=False)
  44. # 时间范围设置
  45. start_time = '{} 00:00:00'.format('2020-01-01')
  46. end_time = '{} 00:00:00'.format('2021-06-01')
  47. sta_days = (datetime.datetime.strptime(end_time, '%Y-%m-%d %H:%M:%S') - datetime.datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S')).days
  48. count= 0
  49. sn_result = {}
  50. for sn in sn_list[:]:
  51. count += 1
  52. logger.info('{} start, {}/{} '.format(sn, str(count), str(len(sn_list))))
  53. if sn[2:5] == '500':
  54. cap = 40
  55. elif sn[2:5] == '504':
  56. cap = 55
  57. else:
  58. logger.info('{} cap error'.format(sn))
  59. cap = None
  60. continue
  61. sn_result.update({'sn':sn})
  62. logger.info('{} :{} to {} start'.format(sn, str(start_time), str(end_time)))
  63. # 获取数据
  64. df_bms, df_gps = dbManager.get_data(sn=sn, start_time=start_time, end_time=end_time, gps_switch=True, mode=0)
  65. if df_bms.empty:
  66. continue
  67. # 数据预处理
  68. # 时间完全相同的数据仅保留一行
  69. df_bms_pro, df_gps_pro = dataPrePro.time_filter(df_bms, df_gps)
  70. # bms数据按照电流和状态分段, 然后在状态分段内部,根据时间跳变继续分段(解决段内数据丢失)
  71. df_bms_pro = dataPrePro.data_split_by_status(df_bms_pro)
  72. df_bms_pro = dataPrePro.data_split_by_time(df_bms_pro)
  73. # bms数据将两次充电间的状态合并
  74. df_bms_pro = dataPrePro.combine_drive_stand(df_bms_pro)
  75. # bms 数据计算行车和充电开始前后的静置时间
  76. df_bms_pro = dataPrePro.cal_stand_time(df_bms_pro)
  77. # gps 数据可靠性判断, 并增加里程和速度至gps数据(根据未合并的数据段判断)
  78. df_bms_pro, df_gps_pro, res_record= dataPrePro.gps_data_judge(df_bms_pro, df_gps_pro)
  79. # gps 数据可靠性判断, 并增加里程和速度至gps数据(根据已合并的数据段判断)
  80. df_bms_pro, df_gps_pro, res_record= dataPrePro.data_gps_judge_after_combine(df_bms_pro, df_gps_pro)
  81. for sta_day in range(sta_days):
  82. try:
  83. st_ = datetime.datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(days=sta_day)
  84. et_ =datetime.datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(days=sta_day+1)
  85. # 按天统计指标
  86. sn_result.update({'time':st_.strftime('%Y-%m-%d')})
  87. df_bms_period = df_bms_pro[(df_bms_pro['时间戳'] > st_.strftime('%Y-%m-%d %H:%M:%S')) & (df_bms_pro['时间戳'] <= et_.strftime('%Y-%m-%d %H:%M:%S'))]
  88. #df_gps_period = df_gps_pro[(df_gps_pro['时间戳'] > st_.strftime('%Y-%m-%d %H:%M:%S')) & (df_gps_pro['时间戳'] <= et_.strftime('%Y-%m-%d %H:%M:%S'))]
  89. sn_result.update({'sumDriveTime':[indexPerSta.drive_time_sta(df_bms_period)]})
  90. sn_result.update({'sumDriveSoc':[indexPerSta.drive_soc_sta(df_bms_period)]})
  91. sn_result.update({'sumDriveAh':[indexPerSta.drive_capacity_sta(cap, df_bms_period)]})
  92. sn_result.update({'sumDriveEnergy':[indexPerSta.drive_energy_sta(cap, df_bms_period)]})
  93. # 每天间隔15分钟 统计一次
  94. for i in range(96):
  95. cur_result = []
  96. st__ = st_ + datetime.timedelta(minutes=15 * i)
  97. et__ = st_ + datetime.timedelta(minutes=15 * (i+1))
  98. df_bms_period = df_bms_pro[(df_bms_pro['时间戳'] > st__.strftime('%Y-%m-%d %H:%M:%S')) & (df_bms_pro['时间戳'] <= et__.strftime('%Y-%m-%d %H:%M:%S'))]
  99. #df_gps_period = df_gps_pro[(df_gps_pro['时间戳'] > st__.strftime('%Y-%m-%d %H:%M:%S')) & (df_gps_pro['时间戳'] <= et__.strftime('%Y-%m-%d %H:%M:%S'))]
  100. cur_result.append(indexPerSta.drive_time_sta(df_bms_period))
  101. cur_result.append(indexPerSta.drive_soc_sta(df_bms_period))
  102. cur_result.append(indexPerSta.drive_capacity_sta(cap, df_bms_period))
  103. cur_result.append(indexPerSta.drive_energy_sta(cap, df_bms_period))
  104. key = st__.strftime('%H:%M') + '-' + et__.strftime('%H:%M')
  105. sn_result.update({key:[cur_result]})
  106. df_cur_res = pd.DataFrame(sn_result)
  107. df_cur_res = df_cur_res[columns]
  108. # 防止写入结果时,结果文件被打开
  109. write_flag = False
  110. while not write_flag:
  111. try:
  112. df_cur_res.to_csv(result_path, mode='a+', index=False, header=False)
  113. except PermissionError as e:
  114. logger.info('{} error:{}'.format(sn, str(e)))
  115. time.sleep(10)
  116. continue
  117. else:
  118. write_flag = True
  119. except Exception as e:
  120. logger.info('{} {}_{} error: {}'.format(sn, st_.strftime('%Y-%m-%d %H:%M:%S'), et_.strftime('%Y-%m-%d %H:%M:%S'), str(e)))
  121. continue
  122. else:
  123. continue
  124. logger.info('{} done, {}/{} '.format(sn, str(count), str(len(sn_list))))
  125. =======
  126. __author__ = 'Wang Liming'
  127. # 每日指标统计函数
  128. import CONFIGURE.PathSetting as PathSetting
  129. import sys
  130. sys.path.append(PathSetting.backend_path)
  131. sys.path.append(PathSetting.middle_path)
  132. import DBManager
  133. import Tools
  134. import DataPreProcess
  135. import IndexStaByPeriod
  136. import Log
  137. import IndexStaByPeriod
  138. import importlib
  139. import datetime
  140. import os
  141. import pandas as pd
  142. import time
  143. importlib.reload(IndexStaByPeriod)
  144. dbManager = DBManager.DBManager()
  145. dataPrePro = DataPreProcess.DataPreProcess()
  146. indexPerSta = IndexStaByPeriod.IndexStaByPeriod()
  147. # log 文件配置
  148. myLog = Log.Mylog('day_sta')
  149. myLog.set_file_hl(file_name=r'D:\Platform\platform\FRONTEND\day_sta\day_sta.log', log_level='info')
  150. myLog.set_stream_hl(log_level='info')
  151. logger = myLog.get_logger()
  152. logger.info(str(os.getpid()))
  153. # sn文件读取
  154. sn_list = list(pd.read_excel('D:\Platform\platform\苏州电池列表.xlsx')['sn'])
  155. sn_list.extend(list(pd.read_excel('D:\Platform\platform\骑享北京6040电池包统计更新20210407.xlsx')['SN号']))
  156. sn = sn_list[0]
  157. # 字段设置及结果文件生成
  158. columns = ['sn', 'time', 'sumDriveTime', 'sumDriveSoc', 'sumDriveAh', 'sumDriveEnergy']
  159. st = datetime.datetime.strptime('00:00:00', '%H:%M:%S')
  160. for i in range(96):
  161. et = st + datetime.timedelta(minutes=15)
  162. columns.append(st.strftime('%H:%M') + '-' + et.strftime('%H:%M'))
  163. st = et
  164. result_path = r'D:\Platform\platform\FRONTEND\day_sta\result.csv'
  165. df_res = pd.DataFrame(columns=columns)
  166. if not os.path.exists(result_path):
  167. df_res.to_csv(result_path, index=False)
  168. # 时间范围设置
  169. start_time = '{} 00:00:00'.format('2020-01-01')
  170. end_time = '{} 00:00:00'.format('2021-06-01')
  171. sta_days = (datetime.datetime.strptime(end_time, '%Y-%m-%d %H:%M:%S') - datetime.datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S')).days
  172. count= 0
  173. sn_result = {}
  174. for sn in sn_list[:]:
  175. count += 1
  176. logger.info('{} start, {}/{} '.format(sn, str(count), str(len(sn_list))))
  177. if sn[2:5] == '500':
  178. cap = 40
  179. elif sn[2:5] == '504':
  180. cap = 55
  181. else:
  182. logger.info('{} cap error'.format(sn))
  183. cap = None
  184. continue
  185. sn_result.update({'sn':sn})
  186. logger.info('{} :{} to {} start'.format(sn, str(start_time), str(end_time)))
  187. # 获取数据
  188. df_bms, df_gps = dbManager.get_data(sn=sn, start_time=start_time, end_time=end_time, gps_switch=True, mode=0)
  189. if df_bms.empty:
  190. continue
  191. # 数据预处理
  192. # 时间完全相同的数据仅保留一行
  193. df_bms_pro, df_gps_pro = dataPrePro.time_filter(df_bms, df_gps)
  194. # bms数据按照电流和状态分段, 然后在状态分段内部,根据时间跳变继续分段(解决段内数据丢失)
  195. df_bms_pro = dataPrePro.data_split_by_status(df_bms_pro)
  196. df_bms_pro = dataPrePro.data_split_by_time(df_bms_pro)
  197. # bms数据将两次充电间的状态合并
  198. df_bms_pro = dataPrePro.combine_drive_stand(df_bms_pro)
  199. # bms 数据计算行车和充电开始前后的静置时间
  200. df_bms_pro = dataPrePro.cal_stand_time(df_bms_pro)
  201. # gps 数据可靠性判断, 并增加里程和速度至gps数据(根据未合并的数据段判断)
  202. df_bms_pro, df_gps_pro, res_record= dataPrePro.gps_data_judge(df_bms_pro, df_gps_pro)
  203. # gps 数据可靠性判断, 并增加里程和速度至gps数据(根据已合并的数据段判断)
  204. df_bms_pro, df_gps_pro, res_record= dataPrePro.data_gps_judge_after_combine(df_bms_pro, df_gps_pro)
  205. for sta_day in range(sta_days):
  206. try:
  207. st_ = datetime.datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(days=sta_day)
  208. et_ =datetime.datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(days=sta_day+1)
  209. # 按天统计指标
  210. sn_result.update({'time':st_.strftime('%Y-%m-%d')})
  211. df_bms_period = df_bms_pro[(df_bms_pro['时间戳'] > st_.strftime('%Y-%m-%d %H:%M:%S')) & (df_bms_pro['时间戳'] <= et_.strftime('%Y-%m-%d %H:%M:%S'))]
  212. #df_gps_period = df_gps_pro[(df_gps_pro['时间戳'] > st_.strftime('%Y-%m-%d %H:%M:%S')) & (df_gps_pro['时间戳'] <= et_.strftime('%Y-%m-%d %H:%M:%S'))]
  213. sn_result.update({'sumDriveTime':[indexPerSta.drive_time_sta(df_bms_period)]})
  214. sn_result.update({'sumDriveSoc':[indexPerSta.drive_soc_sta(df_bms_period)]})
  215. sn_result.update({'sumDriveAh':[indexPerSta.drive_capacity_sta(cap, df_bms_period)]})
  216. sn_result.update({'sumDriveEnergy':[indexPerSta.drive_energy_sta(cap, df_bms_period)]})
  217. # 每天间隔15分钟 统计一次
  218. for i in range(96):
  219. cur_result = []
  220. st__ = st_ + datetime.timedelta(minutes=15 * i)
  221. et__ = st_ + datetime.timedelta(minutes=15 * (i+1))
  222. df_bms_period = df_bms_pro[(df_bms_pro['时间戳'] > st__.strftime('%Y-%m-%d %H:%M:%S')) & (df_bms_pro['时间戳'] <= et__.strftime('%Y-%m-%d %H:%M:%S'))]
  223. #df_gps_period = df_gps_pro[(df_gps_pro['时间戳'] > st__.strftime('%Y-%m-%d %H:%M:%S')) & (df_gps_pro['时间戳'] <= et__.strftime('%Y-%m-%d %H:%M:%S'))]
  224. cur_result.append(indexPerSta.drive_time_sta(df_bms_period))
  225. cur_result.append(indexPerSta.drive_soc_sta(df_bms_period))
  226. cur_result.append(indexPerSta.drive_capacity_sta(cap, df_bms_period))
  227. cur_result.append(indexPerSta.drive_energy_sta(cap, df_bms_period))
  228. key = st__.strftime('%H:%M') + '-' + et__.strftime('%H:%M')
  229. sn_result.update({key:[cur_result]})
  230. df_cur_res = pd.DataFrame(sn_result)
  231. df_cur_res = df_cur_res[columns]
  232. # 防止写入结果时,结果文件被打开
  233. write_flag = False
  234. while not write_flag:
  235. try:
  236. df_cur_res.to_csv(result_path, mode='a+', index=False, header=False)
  237. except PermissionError as e:
  238. logger.info('{} error:{}'.format(sn, str(e)))
  239. time.sleep(10)
  240. continue
  241. else:
  242. write_flag = True
  243. except Exception as e:
  244. logger.info('{} {}_{} error: {}'.format(sn, st_.strftime('%Y-%m-%d %H:%M:%S'), et_.strftime('%Y-%m-%d %H:%M:%S'), str(e)))
  245. continue
  246. else:
  247. continue
  248. logger.info('{} done, {}/{} '.format(sn, str(count), str(len(sn_list))))
  249. >>>>>>> 65a87ae16013552e359df047df19f46fc4e6eb08