wechat_parser.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import pandas as pd
  2. from tkinter import messagebox
  3. from flow_parser_base import FlowParserBase
  4. class WeChatFlowParser(FlowParserBase):
  5. """微众银行流水解析器"""
  6. def parse(self, flow_file_path):
  7. """解析微众银行流水文件,返回标准化的流水数据"""
  8. try:
  9. flow_df = pd.read_excel(flow_file_path, dtype=str, header=1)
  10. flow_df.columns = flow_df.columns.str.strip()
  11. required_columns = ["流水号", "交易时间", "借", "贷", "账户余额", "对方姓名", "对方账号开户行", "备注"]
  12. missing_fields = [k for k in required_columns if k not in flow_df.columns]
  13. if missing_fields:
  14. messagebox.showerror("错误", f"微众银行流水缺少必要列:{missing_fields}")
  15. return None
  16. flow_df["交易时间"] = pd.to_datetime(flow_df["交易时间"], errors='coerce')
  17. flow_df = flow_df.sort_values("交易时间", ascending=True)
  18. standard_flow = []
  19. for _, row in flow_df.iterrows():
  20. transaction_time = row["交易时间"]
  21. debit_str = str(row["借"]).strip()
  22. credit_str = str(row["贷"]).strip()
  23. debit_amount = pd.to_numeric(debit_str.replace(',', ''), errors='coerce') if debit_str != 'nan' else 0
  24. credit_amount = pd.to_numeric(credit_str.replace(',', ''), errors='coerce') if credit_str != 'nan' else 0
  25. balance = str(row["账户余额"]).strip()
  26. opponent_name = str(row["对方姓名"]).strip()
  27. opponent_bank = str(row["对方账号开户行"]).strip()
  28. summary = str(row["备注"]).strip()
  29. expense = debit_amount if pd.notna(debit_amount) and debit_amount > 0 else 0
  30. income = credit_amount if pd.notna(credit_amount) and credit_amount > 0 else 0
  31. transaction_time_str = transaction_time.strftime("%Y-%m-%d %H:%M:%S") if pd.notna(transaction_time) else ""
  32. standard_flow.append({
  33. "交易时间": transaction_time_str,
  34. "对方户名": opponent_name,
  35. "摘要": summary,
  36. "收入": income,
  37. "支出": expense,
  38. "对方开户机构": opponent_bank,
  39. "备注": opponent_bank,
  40. "余额": balance
  41. })
  42. return pd.DataFrame(standard_flow)
  43. except Exception as e:
  44. messagebox.showerror("错误", f"解析微众银行流水失败:{str(e)}")
  45. return None
  46. def get_bank_name(self):
  47. """返回银行名称"""
  48. return "微众银行"