1. 银行流水 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)
清洗流程
运行与验证
准备 bank_flow.csv,至少包含列:交易日期, 账号, 金额, 摘要, 对方账号。执行脚本后生成 bank_flow_clean.csv。
通过条件:
交易日期全部为YYYY-MM-DD格式;- 无
交易日期/账号/金额缺失行; - 去重键组合无重复;
- 输出文件按账号、日期升序排列。
可用 df.duplicated(subset=["账号","交易日期","金额","摘要"]).sum() == 0 与 df["交易日期"].isna().sum() == 0 快速断言。