1. 银行流水 CSV 导入与基础清洗

银行流水 CSV 导入与基础清洗 学习卡片

任务说明

读取银行流水 CSV,把日期统一为 YYYY-MM-DD,按业务主键去重,处理缺失值,输出标准清洗表。核心依赖:pandas。安装:pip install pandas。

实现代码

import pandas as pd

# 1. 读取原始流水
df = pd.read_csv("bank_flow.csv", dtype=str)

# 2. 统一日期格式:兼容 2024/1/5、2024-01-05、20240105
def norm_date(s):
    if pd.isna(s):
        return pd.NaT
    s = str(s).strip().replace("/", "-").replace(".", "-")
    if len(s) == 8 and s.isdigit():
        s = f"{s[:4]}-{s[4:6]}-{s[6:]}"
    return pd.to_datetime(s, errors="coerce")

df["交易日期"] = df["交易日期"].apply(norm_date)

# 3. 金额转数值,非法值置为缺失
df["金额"] = pd.to_numeric(df["金额"], errors="coerce")

# 4. 处理缺失值:关键字段缺失则丢弃,其余填默认值
df = df.dropna(subset=["交易日期", "账号", "金额"])
df["摘要"] = df["摘要"].fillna("未知")
df["对方账号"] = df["对方账号"].fillna("")

# 5. 去重:同一账号+日期+金额+摘要视为重复,保留首条
df = df.drop_duplicates(subset=["账号", "交易日期", "金额", "摘要"], keep="first")

# 6. 输出标准表
df["交易日期"] = df["交易日期"].dt.strftime("%Y-%m-%d")
df = df.sort_values(["账号", "交易日期"]).reset_index(drop=True)
df.to_csv("bank_flow_clean.csv", index=False, encoding="utf-8-sig")
print(df)

清洗流程

读取 CSV dtype=str 日期归一 → YYYY-MM-DD 金额转数值 非法→NaN 缺失值处理 关键字段丢弃 去重+排序 输出标准表 银行流水清洗链路 去重键:账号 + 交易日期 + 金额 + 摘要

运行与验证

准备 bank_flow.csv,至少包含列:交易日期, 账号, 金额, 摘要, 对方账号。执行脚本后生成 bank_flow_clean.csv。

通过条件:

  • 交易日期 全部为 YYYY-MM-DD 格式;
  • 无 交易日期/账号/金额 缺失行;
  • 去重键组合无重复;
  • 输出文件按账号、日期升序排列。

可用 df.duplicated(subset=["账号","交易日期","金额","摘要"]).sum() == 0 与 df["交易日期"].isna().sum() == 0 快速断言。