影刀RPA 数据格式标准化:统一手机号日期格式 影刀RPA 数据格式标准化统一手机号日期格式作者林焱什么情况用什么从不同渠道收集的数据格式五花八门——手机号有加86的、有空格的、有带-的日期有2026-07-01的、有2026/7/1的、有2026年7月1日的。在影刀RPA里需要在合并或分析前先统一格式否则匹配不上、排序不对、统计出错。适用场景多源数据合并前清洗、数据入库前标准化、报表格式统一、客户信息规范化。怎么做手机号标准化店群矩阵自动化突破运营极限importpandasaspdimportredefstandardize_phone(phone):手机号标准化ifpd.isna(phone):returnphonestr(phone).strip()# 去除所有非数字字符phonere.sub(r[^0-9],,phone)# 处理带国家码的8613800138000 → 13800138000iflen(phone)13andphone.startswith(86):phonephone[2:]# 处理带0前缀的013800138000 → 13800138000iflen(phone)12andphone.startswith(0):phonephone[1:]# 验证是否是有效手机号ifre.match(r^1[3-9]\d{9}$,phone):returnphonereturn# 无效手机号返回空# 使用df[手机号]df[手机号].apply(standardize_phone)日期格式标准化defstandardize_date(date_str):日期格式标准化为 YYYY-MM-DDifpd.isna(date_str)orstr(date_str).strip():returnNonedate_strstr(date_str).strip()# 尝试多种格式formats[%Y-%m-%d,# 2026-07-01%Y/%m/%d,# 2026/07/01%Y.%m.%d,# 2026.07.01%Y年%m月%d日,# 2026年7月1日%Y%m%d,# 20260701%d/%m/%Y,# 01/07/2026%m/%d/%Y,# 07/01/2026%Y-%m-%d %H:%M:%S,# 2026-07-01 12:30:00]forfmtinformats:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2b6395c25fe0438481dd36d6dbfd736d.png#pic_center)try:dtpd.to_datetime(date_str,formatfmt)returndt.strftime(%Y-%m-%d)except:continue# 尝试pandas自动解析try:dtpd.to_datetime(date_str,errorscoerce)ifpd.notna(dt):returndt.strftime(%Y-%m-%d)except:passreturnNone# 无法解析# 使用df[日期]df[日期].apply(standardize_date)身份证号标准化defstandardize_id_card(id_card):身份证号标准化ifpd.isna(id_card):returnid_cardstr(id_card).strip().upper()# X转大写id_cardre.sub(r[^0-9X],,id_card)# 去除非数字和非X# 验证长度iflen(id_card)18:# 18位身份证ifre.match(r^\d{17}[\dX]$,id_card):returnid_cardeliflen(id_card)15:# 15位老身份证可选转为18位returnid_cardreturn# 无效# 从身份证提取信息defextract_id_info(id_card):从身份证提取生日和性别iflen(id_card)!18:returnNone,None# 提取生日birthf{id_card[6:10]}-{id_card[10:12]}-{id_card[12:14]}# 提取性别第17位奇数男偶数女gender男ifint(id_card[16])%21else女returnbirth,gender金额格式标准化defstandardize_amount(amount):金额标准化为浮点数ifpd.isna(amount):return0.0amountstr(amount).strip()# 去除货币符号和千分位amountamount.replace(¥,).replace(,).replace($,)amountamount.replace(,,).replace(,)amountamount.replace(元,).replace(万,)# 处理万单位is_wan万instr(amount)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a8dd3071d29b4bbca190ed1493c08850.png#pic_center)amountre.sub(r[^0-9.\-],,str(amount))try:valuefloat(amount)ifis_wan:value*10000returnround(value,2)except:return0.0# 使用df[金额]df[金额].apply(standardize_amount)综合数据标准化defstandardize_data(df,rulesNone): 数据标准化主函数 rules: { 手机号: phone, 日期: date, 身份证: id_card, 金额: amount, 邮箱: email, 姓名: name } ifrulesisNone:rules{}standardizers{phone:standardize_phone,date:standardize_date,id_card:standardize_id_card,amount:standardize_amount,email:lambdax:str(x).strip().lower()ifpd.notna(x)else,name:lambdax:str(x).strip().replace( ,)ifpd.notna(x)else,}forcol,std_typeinrules.items():ifcolindf.columns:original_countdf[col].notna().sum()df[col]df[col].apply(standardizers[std_type])valid_countdf[col].apply(lambdax:bool(x)).sum()invalid_rate(1-valid_count/original_count)*100iforiginal_count0else0print(f{col}: 标准化完成, 有效率{100-invalid_rate:.1f}%)returndf# 使用dfpd.read_excel(rC:\Data\raw_contacts.xlsx)dfstandardize_data(df,rules{手机号:phone,入职日期:date,身份证号:id_card,月薪:amount,邮箱:email,姓名:name})df.to_excel(rC:\Data\standardized.xlsx,indexFalse)影刀RPA标准化流程【读取Excel文件】→ 原始数据 【执行Python代码】→ 数据标准化 1. 手机号清洗 2. 日期格式统一 3. 身份证验证 4. 金额清洗 5. ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/cc1cf4aaaeef4e3482ace0c8d262b6fa.png#pic_center) 6. 邮箱转小写 【执行Python代码】→ 生成标准化报告有效率统计 【写入Excel文件】→ 标准化数据有什么坑坑1Excel日期序列号temu店群自动化报活动案例# 问题从Excel读出的日期是数字44213而不是2026-07-01# 原因Excel内部用序列号存储日期# 解决用pd.to_datetime指定unitdatepd.to_datetime(44213,unitD,origin1899-12-30)# 结果2026-07-01![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6c79c9c9b20148c881cd9c2e452d2b6a.png#pic_center)# 或在读取时指定dfpd.read_excel(file,dtype{日期:str})# 读为字符串坑2手机号被科学计数法# 问题Excel中手机号显示为1.38E10# 原因数字列宽度不够或格式为数值# 解决读取时指定dtypedfpd.read_excel(file,dtype{手机号:str})# 或读取后修复df[手机号]df[手机号].astype(str).str.replace(.0,).str.replace(E10,)# 更好的方案用格式化df[手机号]df[手机号].apply(lambdax:f{int(float(x)):011d}ifxelse)坑3日期歧义# 问题01/02/2026 是1月2日还是2月1日# 美国格式月/日/年 → 1月2日# 欧洲格式日/月/年 → 2月1日# 解决根据数据来源指定![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/394530dedcbc4956a7885dd100d9c53b.png#pic_center)# 中国数据通常用YYYY-MM-DD不会有歧义# 如果遇到DD/MM/YYYY格式df[日期]pd.to_datetime(df[日期],format%d/%m/%Y,errorscoerce)坑4全半角混用# 问题手机号中有全角数字# 解决全角转半角importunicodedatadefto_halfwidth(text):全角转半角ifpd.isna(text):returntextreturnunicodedata.normalize(NFKC,str(text))df[手机号]df[手机号].apply(to_halfwidth).apply(standardize_phone)坑5标准化后空值处理# 问题标准化后无效数据变成空字符串但后续统计可能把它当成有效值# 解决空字符串转回NaNdf[手机号]df[手机号].replace(,pd.NA)# 统计有效率时![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4f2b77108a5c413f9daa55cd7fd0f9aa.png#pic_center)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4f218c64bc0844cc9c64cb1252e04419.png#pic_center)totallen(df)validdf[手机号].notna().sum()print(f手机号有效率:{valid/total*100:.1f}%)