data_status.py 4.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. ##修订电池的状态码,处理对象为清洗后并合并清洗后合并gps的数据
  2. import pandas as pd
  3. import numpy as np
  4. ##修订电池的状态码,充电soc的变化率最小值设定c_soc_dif_p,充电时间的最小值设定c_order_delta,
  5. ##静置soc的变化率最小值设定s_soc_dif_p,静置时间的最小值设定s_order_delta,
  6. def data_status(df_merge,c_soc_dif_p=0.3,s_soc_dif_p=0,c_order_delta=1200,s_order_delta=120):
  7. ##构建状态的flag
  8. df_merge=df_merge.sort_values(["sn","time"],ascending = [True, True])
  9. df_merge["flag"]="d"
  10. df_merge["flag"][df_merge["pack_crnt"]<0]="c"
  11. df_merge["flag"][df_merge["pack_crnt"]==0]="s"
  12. ##构建连续的flag标记为flag_block
  13. df_merge['flag_block']=(df_merge["flag"].shift(1) != df_merge["flag"]).astype(int).cumsum()
  14. ##针对充电,按照条件筛选
  15. ##首先统计在每个flag区间上的soc和开始结束时间
  16. df_merge_c=df_merge[df_merge["flag"]=="c"]
  17. df_merge_c_soc_b=df_merge_c[["pack_soc","sn","flag_block"]].groupby(["sn","flag_block"]).first()
  18. df_merge_c_soc_e=df_merge_c[["pack_soc","sn","flag_block"]].groupby(["sn","flag_block"]).last()
  19. df_merge_c_time_b=df_merge_c[["time","sn","flag_block"]].groupby(["sn","flag_block"]).first()
  20. df_merge_c_time_e=df_merge_c[["time","sn","flag_block"]].groupby(["sn","flag_block"]).last()
  21. frames=[df_merge_c_soc_b,df_merge_c_soc_e,df_merge_c_time_b,df_merge_c_time_e]
  22. df_merge_c_choice = pd.concat(frames, axis=1, join='inner')
  23. df_merge_c_choice=df_merge_c_choice.reset_index()
  24. df_merge_c_choice.columns=["sn","charge_block","soc_first","soc_last","time_first","time_last"]
  25. df_merge_c_choice["soc_dif_p"]=(df_merge_c_choice["soc_last"]-df_merge_c_choice["soc_first"])/df_merge_c_choice["soc_first"]
  26. df_merge_c_choice["order_delta"]=pd.to_timedelta(pd.to_datetime(df_merge_c_choice["time_last"])-pd.to_datetime(df_merge_c_choice["time_first"])).dt.total_seconds()
  27. df_merge_c_choice["order_delta_h"]=round(df_merge_c_choice["order_delta"]/3600,2)
  28. df_merge_c_choice["rate"]=(df_merge_c_choice["soc_last"]-df_merge_c_choice["soc_first"])/df_merge_c_choice["order_delta_h"]
  29. df_merge_c_choice_result1=df_merge_c_choice[(df_merge_c_choice["soc_dif_p"]>=c_soc_dif_p)&(df_merge_c_choice["order_delta"]>=c_order_delta)&(df_merge_c_choice["rate"]>0.1)]
  30. df_merge_c_choice_result2=df_merge_c_choice[(df_merge_c_choice["soc_dif_p"]>=c_soc_dif_p)&(df_merge_c_choice["order_delta"]>=c_order_delta)&(df_merge_c_choice["rate"]<=0.1)]
  31. df_merge_c21=df_merge_c[(df_merge_c["sn"].isin(df_merge_c_choice_result1["sn"]))&(df_merge_c["flag_block"].isin (df_merge_c_choice_result1["charge_block"])) ]
  32. df_merge_c22=df_merge_c[(df_merge_c["sn"].isin(df_merge_c_choice_result2["sn"]))&(df_merge_c["flag_block"].isin (df_merge_c_choice_result2["charge_block"])) ]
  33. ##更新电池的状态码
  34. df_merge["bms_sta"]=3
  35. df_merge["bms_sta"][df_merge_c21.index]=21
  36. df_merge["bms_sta"][df_merge_c22.index]=22
  37. ##针对静置,按条件筛选
  38. ##首先统计在每个flag区间上的soc和开始结束时间
  39. df_merge_s=df_merge[df_merge["flag"]=="s"]
  40. df_merge_s_soc_b=df_merge_s[["pack_soc","sn","flag_block"]].groupby(["sn","flag_block"]).first()
  41. df_merge_s_soc_e=df_merge_s[["pack_soc","sn","flag_block"]].groupby(["sn","flag_block"]).last()
  42. df_merge_s_time_b=df_merge_s[["time","sn","flag_block"]].groupby(["sn","flag_block"]).first()
  43. df_merge_s_time_e=df_merge_s[["time","sn","flag_block"]].groupby(["sn","flag_block"]).last()
  44. frames=[df_merge_s_soc_b,df_merge_s_soc_e,df_merge_s_time_b,df_merge_s_time_e]
  45. df_merge_s_choice = pd.concat(frames, axis=1, join='inner')
  46. df_merge_s_choice=df_merge_s_choice.reset_index()
  47. df_merge_s_choice.columns=["sn","charge_block","soc_first","soc_last","time_first","time_last"]
  48. df_merge_s_choice["soc_dif_p"]=(df_merge_s_choice["soc_last"]-df_merge_s_choice["soc_first"])/df_merge_s_choice["soc_first"]
  49. df_merge_s_choice["order_delta"]=pd.to_timedelta(pd.to_datetime(df_merge_s_choice["time_last"])-pd.to_datetime(df_merge_s_choice["time_first"])).dt.total_seconds()
  50. df_merge_s_choice_result=df_merge_s_choice[df_merge_s_choice["order_delta"]>=s_order_delta]
  51. df_merge_s2=df_merge_s[(df_merge_s["sn"].isin(df_merge_s_choice_result["sn"]))&(df_merge_s["flag_block"].isin (df_merge_s_choice_result["charge_block"])) ]
  52. ##更新充电的状态码
  53. df_merge["bms_sta"][df_merge_s2.index]=0
  54. df_merge=df_merge.drop(['flag', 'flag_block'], axis=1, inplace=False)
  55. return df_merge