zhijian.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. # -*- coding: UTF-8 -*-
  2. '''
  3. @Project :jh5sonar_newest
  4. @File :zhijian.py
  5. @Author :Fang
  6. @Date :2024/7/26
  7. '''
  8. from hard_disk_storage import HardDiskStorage
  9. import pandas as pd
  10. hard_disk_db = HardDiskStorage()
  11. sql = "SELECT image_name, datetime FROM sonar_data ORDER BY datetime ASC;"
  12. var = ()
  13. res = hard_disk_db.execute_sql(sql, var)
  14. # 转换为 DataFrame
  15. df = pd.DataFrame(res)
  16. # 提取时间戳部分
  17. df['timestamp'] = df['image_name'].apply(lambda x: x.split('_')[0])
  18. # 统计每个时间戳的数据条数
  19. timestamp_counts = df.groupby('timestamp').size().reset_index(name='count')
  20. # 转换 datetime 字段为 datetime 类型
  21. df['datetime'] = pd.to_datetime(df['datetime'])
  22. # 计算每组的最后一个 datetime 和下一组的第一个 datetime 的时间差
  23. time_differences = []
  24. timestamps = df['timestamp'].unique()
  25. for i in range(len(timestamps)):
  26. if i == 0:
  27. group_1_num = timestamp_counts[timestamp_counts['timestamp'] == timestamps[i]]['count'].values[0]
  28. group_1_first = df[df['timestamp'] == timestamps[i]]['datetime'].min()
  29. group_1_last = df[df['timestamp'] == timestamps[i]]['datetime'].max()
  30. local_time_diff = group_1_last - group_1_first
  31. local_total_seconds = local_time_diff.total_seconds()
  32. local_minutes = int(local_total_seconds // 60)
  33. local_seconds = int(local_total_seconds % 60)
  34. time_error_flag = ''
  35. num_error_flag = ''
  36. local_time_error_flag = ''
  37. minutes = 0
  38. seconds = 0
  39. time_differences.append({
  40. '时间戳': timestamps[i],
  41. '图片张数': group_1_num,
  42. '第一组': group_1_first.strftime('%d日 %H:%M:%S'),
  43. '最后一组': group_1_last.strftime('%d日 %H:%M:%S'),
  44. '花费时间': f'{local_minutes} 分 {local_seconds} 秒',
  45. '与上一组间隔时间': f'{minutes} 分 {seconds} 秒',
  46. '间隔时间异常': time_error_flag,
  47. '采集数量异常': num_error_flag,
  48. '采集时间异常': local_time_error_flag,
  49. })
  50. continue
  51. time_error_flag = ''
  52. num_error_flag = ''
  53. local_time_error_flag = ''
  54. group_1_last = df[df['timestamp'] == timestamps[i]]['datetime'].max()
  55. group_1_first = df[df['timestamp'] == timestamps[i]]['datetime'].min()
  56. local_time_diff = group_1_last - group_1_first
  57. local_total_seconds = local_time_diff.total_seconds()
  58. local_minutes = int(local_total_seconds // 60)
  59. local_seconds = int(local_total_seconds % 60)
  60. group_2_last = df[df['timestamp'] == timestamps[i - 1]]['datetime'].max()
  61. time_diff = group_1_first - group_2_last
  62. # 转换时间间隔为秒
  63. total_seconds = time_diff.total_seconds()
  64. minutes = int(total_seconds // 60)
  65. seconds = int(total_seconds % 60)
  66. group_1_num = timestamp_counts[timestamp_counts['timestamp'] == timestamps[i]]['count'].values[0]
  67. group_2_num = timestamp_counts[timestamp_counts['timestamp'] == timestamps[i - 1]]['count'].values[0]
  68. num_diff = abs(group_1_num - group_2_num)
  69. # 判断是否大于5分钟
  70. if local_time_diff > pd.Timedelta(seconds=40) or local_time_diff < pd.Timedelta(seconds=20):
  71. local_time_error_flag = True
  72. if time_diff > pd.Timedelta(minutes=5):
  73. time_error_flag = True
  74. if num_diff > 10:
  75. num_error_flag = True
  76. time_differences.append({
  77. '时间戳': timestamps[i],
  78. '图片张数': group_1_num,
  79. '第一组':group_1_first.strftime('%d日 %H:%M:%S'),
  80. '最后一组':group_1_last.strftime('%d日 %H:%M:%S'),
  81. '花费时间':f'{local_minutes} 分 {local_seconds} 秒',
  82. '与上一组间隔时间': f'{minutes} 分 {seconds} 秒',
  83. '间隔时间异常':time_error_flag,
  84. '采集数量异常':num_error_flag,
  85. '采集时间异常': local_time_error_flag,
  86. })
  87. # 自定义居中对齐的输出格式,确保表头和数据列对齐
  88. def print_centered(df):
  89. # 计算每列的最大宽度,考虑到列标题和数据的最大值
  90. col_widths = [max(df[col].astype(str).map(len).max(), len(col)) for col in df.columns]
  91. # 打印表头,并且确保宽度和数据一致
  92. header = " | ".join([f"{col:^{width}}" for col, width in zip(df.columns, col_widths)])
  93. print(header)
  94. print("-" * len(header)) # 打印分隔符,长度与表头一致
  95. # 打印每一行数据,保持列宽与表头一致
  96. for _, row in df.iterrows():
  97. print(" | ".join([f"{str(val):^{width}}" for val, width in zip(row, col_widths)]))
  98. # 转换为 DataFrame
  99. time_diff_df = pd.DataFrame(time_differences)
  100. # 显示时间间隔的结果
  101. print("每两组时间戳的时间间隔(分和秒):")
  102. print_centered(time_diff_df)
  103. time_diff_df.to_excel('2024_08_21_001声呐.xlsx',index=False)
  104. print("目前测试总数:",len(timestamps) , '组')