time_count.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import pandas as pd
  2. # 示例数据
  3. data = {
  4. 'state': [0, 21201000300, 21201000300, 0, 21201000001, 21201000001, 21201000002, 21201000002, 0],
  5. 'simTime': [0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08]
  6. }
  7. # 创建DataFrame
  8. df = pd.DataFrame(data)
  9. # 目标错误码列表
  10. target_error_codes = [21201000300, 21201000001, 21201000002]
  11. # 初始化一个字典来存储每个错误码的时间段
  12. error_periods = {error_code: [] for error_code in target_error_codes}
  13. # 遍历DataFrame,检测目标错误码并统计时间段
  14. current_error_code = None
  15. start_time = None
  16. for index, row in df.iterrows():
  17. if row['state'] in target_error_codes:
  18. if current_error_code is None or current_error_code != row['state']:
  19. # 如果当前错误码与前一个不同,或者这是第一个错误码,则记录新的时间段开始
  20. current_error_code = row['state']
  21. start_time = row['simTime']
  22. else:
  23. # 如果当前行不是目标错误码,并且我们之前记录了一个错误码,则记录时间段结束
  24. if current_error_code is not None:
  25. # 注意:这里我们假设下一个非匹配行的时间不是当前错误码的时间段的一部分
  26. # 但为了包含整个错误码持续的时间,我们不减去任何时间
  27. error_periods[current_error_code].append((start_time, row['simTime']))
  28. current_error_code = None
  29. # 处理最后一个错误码的时间段(如果DataFrame以错误码结束)
  30. if current_error_code is not None:
  31. # 由于我们想要包含最后一个错误码的时间点,所以我们需要检查是否有下一个时间点
  32. # 如果没有(即这是DataFrame的最后一行),我们就直接使用最后一个时间点
  33. end_time = df['simTime'].iloc[-1] if current_error_code == df['state'].iloc[-1] else df['simTime'].iloc[-2]
  34. error_periods[current_error_code].append((start_time, end_time))
  35. # 格式化时间段并输出结果
  36. for error_code, periods in error_periods.items():
  37. print("error_periods is", error_periods)
  38. if periods:
  39. print(f"Error Code {error_code} has the following time periods:")
  40. for start, end in periods:
  41. print(f" {start:.2f} to {end:.2f}")
  42. else:
  43. print(f"No time periods found for Error Code {error_code}.")