1-4 体检报告的输出与归档


文档摘要

1-4 体检报告的输出与归档 本节摘要:tocsv与toexcel负责把体检结果写成报告归档。本节的核心是三件事:索引要不要跟着写出去、中文怎么不乱码、Excel怎么一簿多表地归档。结尾给出一条从读入到写出的完整闭环代码。 登记窗口(1-3)负责进,本节负责出。流水线的价值最终落在产出物上:给业务方一份Excel、给下游系统一份CSV、给自己留一份可复现的中间档案。 索引:写还是不写 默认写出的文件第一列是没有名字的0到n,下游同事读的时候要么skip,要么将就着一个怪列。给系统的CSV用index=False,给自己的中间档案用index=True(尤其时间索引,丢了重排很麻烦),是我在实践中固定的分工。

1-4 体检报告的输出与归档

本节摘要:to_csv与to_excel负责把体检结果写成报告归档。本节的核心是三件事:索引要不要跟着写出去、中文怎么不乱码、Excel怎么一簿多表地归档。结尾给出一条从读入到写出的完整闭环代码。

登记窗口(1-3)负责进,本节负责出。流水线的价值最终落在产出物上:给业务方一份Excel、给下游系统一份CSV、给自己留一份可复现的中间档案。

索引:写还是不写

import pandas as pd df = pd.DataFrame({ '日期': ['2024-01-03', '2024-01-10', '2024-01-15'], '金额': [1280, 1732, 880], }) # 默认:挂号条被写成第一列,列名空着 df.to_csv('默认.csv') # 大多数给下游系统的报告不该带这个无名的序号列 df.to_csv('干净.csv', index=False)

默认写出的文件第一列是没有名字的0到n,下游同事读的时候要么skip,要么将就着一个怪列。**给系统的CSV用index=False,给自己的中间档案用index=True**(尤其时间索引,丢了重排很麻烦),是我在实践中固定的分工。

# 带时间索引的随访档案:索引必须一起归档 ts = df.set_index('日期') ts.to_csv('随访.csv') # 日期列保留 back = pd.read_csv('随访.csv', index_col=0, parse_dates=['日期']) print(back.index.dtype) # datetime64[ns] —— 回读后类型还在

中文乱码的预防针

# 症状:Excel打开CSV,中文全成乱码 # 病因:Excel默认按GBK解码UTF-8文件 # 处置:写文件时就带BOM,Excel就能认出UTF-8 df.to_csv('报告.csv', index=False, encoding='utf-8-sig') # 缺席值不想留空字符串,写一个明确的占位符 df.to_csv('报告.csv', index=False, encoding='utf-8-sig', na_rep='缺失')

utf-8-sig与1-3的encoding='gbk'正好是一对:进门看来源,出门看去处。给Excel人看的文件用带BOM的UTF-8,兼容性最好。

Excel归档:一簿多表

# 一簿多表:总览、明细、异常清单各占一表 with pd.ExcelWriter('月度体检报告.xlsx', engine='openpyxl') as w: df.to_excel(w, sheet_name='总览', index=False) df[df['金额'] > 1000].to_excel(w, sheet_name='大额明细', index=False) df[df['金额'] < 900].to_excel(w, sheet_name='待核查', index=False) # float_format控制小数位,别让报告里出现一串循环小数 df['金额'].to_frame().to_excel('金额.xlsx', index=False, float_format='%.2f')

⚠️ 常见坑:to_excel一次写一个表,循环里反复调用同名文件且不指定mode='a',会每次覆盖只剩最后一张表。用ExcelWriter上下文管理器一次写全,是唯一稳妥姿势。

一条完整闭环

把本章四节串成一条从进门到出门的最小闭环,这段代码可以直接当接诊模板用:

import pandas as pd # 1-3 登记:进门三件事 + 类型预定 df = pd.read_csv('sales.csv', parse_dates=['日期'], dtype={'门店': 'category', '金额': 'float64'}) print(df.shape, df.dtypes.unique()) # 1-1/1-2 建档挂号:日期升格为随访号 ts = df.set_index('日期').sort_index() # 第一跳体检:单日金额概览(向量化,无循环) daily = ts['金额'].resample('D').sum() # 第07章会展开,这里先感受 print(daily.head(3)) # 1-4 归档:给系统的CSV不带索引列,给人的Excel带BOM daily.to_csv('daily.csv', encoding='utf-8-sig') daily.to_frame().to_excel('daily.xlsx') print('归档完成')

本章流水线全景

接诊建档四步与产出口径

接诊建档四步与产出口径

本节要点回顾

  • index参数的分工:给系统False、给自己True,时间索引必须归档
  • utf-8-sig是给Excel人的中文预防针,与进门侧的gbk处理成对
  • ExcelWriter上下文一次写多表,避免循环覆盖
  • float_format与na_rep让报告干净,别让循环小数和空串出门
  • 闭环模板:读、查、挂索引、聚合、写出,五行骨架可复用

追问:中间结果要不要落盘

长流水线跑到一半,怕断电怕报错,中间档案落不落盘是个实际的取舍。我的习惯是三条:数据量在内存承受范围内就不落盘,落盘反而引入读写误差与版本混乱;确实要落盘用带时间戳的文件名,别覆盖上一次的检查结果;落盘格式优先parquet(保留类型、体积小),CSV只做给人看的最终报告。类型保真这一点是CSV的硬伤——category落盘成CSV再读回来就变object了,体检等于白做。

# parquet:类型保真的中间档案(需要pyarrow) # ts.to_parquet('中间档案.parquet') # CSV:只做给人的最终报告 ts.to_csv('报告.csv', encoding='utf-8-sig')

进出两头的规矩立好,第一章的建档环节就闭环了:进有参数、出有口径、中间有档案策略。

第一章结束。下一章病人进分诊台:三千条记录里按需叫号,loc、iloc与布尔索引等着接手。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U