ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

2003-2024地级市财政数据清洗与分析实战指南

2026/9/9 17:02:11 拓冰建站 浏览量
2003-2024地级市财政数据清洗与分析实战指南 2023年了还有人在用Excel手动汇总地级市财政数据我真的会心痛。这份2003到2024年的地级市财政收入支出明细统计横跨22年覆盖全国几百个地级市字段又细又全只要你肯花一晚上把它整理明白后面写论文、做分析、出报告都能省下大把时间。这篇文章我不打算只给你讲“数据里面有什么”而是把你拿到这份xlsx之后最可能遇到的坑、最应该掌握的清洗和分析思路一次性讲透。1. 先看清楚这张表到底长什么样1.1 表的底层逻辑每一行是“城市×年份×收支科目”还是“城市×年份”拿到任何一份面板数据第一件事不是急着跑代码而是先把数据表的结构搞清楚。这份财政收入支出明细我建议你先用WPS或者Excel打开一个Sheet看一眼重点确认两件事第一表头是不是双层表头第二同一张Sheet里是不是同时混着一般公共预算收入、政府性基金收入、国有资本经营预算收入三个口径。从标题看“地级市-财政收入支出明细统计”大概率是长表结构也就是每一行代表一个地级市在某一年某一个收支科目下的数值。但我也见过不少版本是宽表列名直接叫“2003年一般公共预算收入”、“2003年一般公共预算支出”。这两种结构处理方式完全不同宽表适合直接看长表适合做面板回归。如果你拿到的是宽表后续做分析前必须用pd.wide_to_long或者pivot_longer把它转成长表否则你没法按年份做连续对比。我拿到这类数据后的第一步永远是先列字段清单行政区划代码六位数字前两位是省中间两位是市城市名称所属省份年份收入类科目税收收入、非税收入、增值税、企业所得税、个人所得税、城市维护建设税等支出类科目一般公共服务、教育、社会保障和就业、卫生健康、农林水、交通运输、债务付息等数值单位万元还是亿元这个必须确认1.2 时间跨度里的“口径断裂点”不懂会算错趋势2003-2024年这22年看着连续实际上统计口径发生过好几次大调整。最典型的是2007年政府收支分类改革那一年全国财政收支科目体系全面换血以前叫“农业支出”、“林业支出”2007年以后并入“农林水支出”以前“行政管理费”这个科目也改成了“一般公共服务支出”。所以如果你直接拿2006年和2008年的“一般公共服务支出”做对比看起来像暴涨暴跌其实是口径变了不是真的大幅变动。再往后走还有2015年的新预算法实施和2020年预算管理一体化改革这些都会影响某些科目下的数据颗粒度。所以你在生成描述性统计表的时候要么把数据按前后两段分开描述要么在脚注里明确标注口径变化点。处理口径断裂的一般做法是把2007年前的科目做映射归类能并的并能拆的拆但有些科目实在无法对齐那就建议直接以2007年为起点做连续分析2003-2006年只做总量参考。另一个容易踩的坑是价格因素。2003年到2024年物价水平和区域经济体量发生了巨大变化名义值直接比较毫无意义。我在做跨年份趋势图之前一定会用GDP平减指数或者CPI把名义财政收支调整为实际值。如果你用的是省级居民消费价格指数注意地级市层面有时候只有省级数据可用那就用所在省份的CPI去调整并且在校验部分说明这个局限。1.3 缺失值、极端值、行政代码的坑地级市数据最烦人的不是字段多而是行政区划一直在动。举个例子2011年撤销巢湖地级市原地级市巢湖市被拆分合肥、芜湖、马鞍山三个市的代码和数据口径全都变了2019年撤销莱芜地级市整体并入济南2021年的三沙市和儋州市也做过调整。如果你拿到的是2003-2024年全序列一定要核对每个城市的六位行政区划代码是否在中间年份发生过变化。最稳妥的办法是以最新年份的行政区划代码为基准把历史代码统一映射到最新代码上。但要注意如果城市做过拆分简单映射会失真这时候要么按比例拆分历史数据要么在样本中剔除该城市并做稳健性检验。缺失值在财政数据里也很常见尤其是2003-2006年部分地级市的数据经常只报了总收入总支出明细科目是空的。这时候别急着插值先看缺失比例。如果缺失比例低于5%可以用线性插值或者前向填充但要在结果表里标记哪些是填充出来的。如果某个地级市某年的核心指标全部缺失直接删掉那一行反而更干净对估计结果影响也小。还有一种情况是“0值”很多初学者会把0值和缺失值混为一谈但财政数据里的0值往往是没发生该笔收支不是没统计处理方式完全不一样。2. 数据清洗与校验动手写代码前先把逻辑盘清楚2.1 清洗流程设计从原始xlsx到标准面板的完整Step-by-Step拿到xlsx后我不建议你直接在Excel里手动改。22年、几百个城市、几十个科目量级至少在十万行以上手动操作不仅慢还容易错。我通常的做法是先用Python的pandas库做一遍全自动清洗把它整理成标准面板数据再输出成一个新的“干净版”xlsx后续所有分析都基于这个干净版。第一步是批量读取。如果你的文件是一个xlsx但分了好几个Sheet比如一年一个Sheet用pd.read_excel(财政数据.xlsx, sheet_nameNone)一次性读进来返回一个字典每个Sheet对应一个DataFrame。如果文件名是按年份拆的比如“2003年财政收入.xlsx”这种那就用glob.glob(*.xlsx)匹配所有文件循环读取再pd.concat纵向拼接。import pandas as pd import glob # 场景A一个文件多个Sheet all_sheets pd.read_excel(地级市财政收支明细_2003_2024.xlsx, sheet_nameNone) df_list [] for year, df in all_sheets.items(): df[year] int(year) df_list.append(df) df_raw pd.concat(df_list, ignore_indexTrue) # 场景B多个文件文件名含年份 files glob.glob(地级市财政_*.xlsx) df_list [] for f in files: year f.split(_)[1].split(.)[0] df pd.read_excel(f) df[year] int(year) df_list.append(df) df_raw pd.concat(df_list, ignore_indexTrue)第二步是统一列名。不同年份的Sheet如果出自不同统计口径列名经常会变比如有的叫“增值税”有的叫“国内增值税”有的叫“税收收入-增值税”。我一般会手动构造一个列名映射字典把同义字段映射到统一命名然后用df.rename(columnsmapping)处理。这一步看着笨但却是后面所有分析不出错的前提。省下来的时间比你想象的多得多。第三步是消除重复。同一地级市同一年同一个科目理论上只能有一个数值。如果出现重复说明原始数据里有汇总行或者内部Sheet有重复统计。我建议用df.drop_duplicates(subset[city_code, year, item], keepFalse)先把完全重复的行全部删掉然后单独检查哪些重复行是“城市合计”被当成普通行混进来了这类是汇总行必须剔除。2.2 校验逻辑总量分项之和这个恒等式不成立就是数据有问题清洗完了不要急着分析先做校验。财政收支数据有个天然的自检规则收入总计应该等于各分项收入之和支出总计应该等于各分项支出之和。如果对不上要么是某些分项没抓全要么是原始数据本身有误。我用pandas做校验的思路是这样先把宽表转成长表然后用groupby把各科目加总再和“总计”字段对比差多少、差在哪一年、哪一个城市全部列出来。# 假设df是长表city_code, city_name, year, item, value pivot_df df.pivot_table(index[city_code, year], columnsitem, valuesvalue, aggfuncsum).reset_index() pivot_df[calc_income_total] ( pivot_df[税收收入] pivot_df[非税收入] ) pivot_df[income_diff] pivot_df[收入总计] - pivot_df[calc_income_total] issues pivot_df[pivot_df[income_diff].abs() 1] # 允许1个单位内的浮点误差 print(issues[[city_code, year, income_diff]].head(20))如果diff值很大一定得回去翻原始表。常见原因有两种一是原始表里包含“上级补助收入”、“债务收入”这些转移性收入这些不属于一般公共预算收入的分项却被合并在“收入总计”里二是有些城市单独列了一项“其他收入”你在构造分项加总时漏了它。支出同理也要注意是否存在“年终结余”这类非列支项目混入总计的情况。所以我一直强调清洗不是简单把数据读进来而是要带着财政收支的逻辑去校验。我见过太多人在缺失值和重复值上花了一整天结果根本没发现“收入总计”和“分项之和”差了几十亿最后跑回归的时候结果全部偏掉还以为是模型问题。2.3 口径统一万元与亿元千万别混着用财政数据最坑的就是单位不统一。同一个Sheet里有的城市用万元有的城市用亿元甚至同一张表里“收入”用万元、“支出”用亿元这种混用我见过不止一次。所以清洗的第二道硬规则就是全部统一为“万元”并在目录里明确标注。怎么检查单位有没有混看数值分布。地级市的一般公共预算收入通常在几十亿到几千亿之间换算成万元就是几十万到几百万的规模。如果你的数据列里同时出现几十和几百万的量级基本可以断定是单位混了。直接处理方式是用中位数配合业务逻辑做判断超过某个阈值比如交易性金融资产这类不存在的科目就除10000低于合理下限就乘10000。但这个阈值必须结合你对数据量级的了解来定不能瞎猜。另外如果你后续要做对数变换先把所有非正数处理掉。财政收入数据里偶尔会出现“债务还本支出”为负数、或者净额科目为负值的情况直接取对数会报错。我一般用np.log1p也就是log(x1)因为财政科目数值都很大加1再取对数几乎不影响数值还能保住负数样本不丢失。3. 分析维度与可视化一份地级市财政数据能看出太多东西3.1 时间维度总量增长、结构变化与五年规划周期把数据整理成面板之后我最先做的永远是画一张全国地级市财政收入总规模的时间序列图。这张图能瞬间告诉你22年间财政收支的整体走势也能看出2008年金融危机、2015年经济新常态、2020年疫情冲击等关键节点的波动。画图用matplotlib或者seaborn都行但如果你要对几十个城市做分面图我更推荐用seaborn的FacetGrid一行代码分省份、分城市展示适合做初步探索。还有个很实用的分析角度是五年规划周期。中国每个五年规划期财政支出的重点方向会有明显变化。你有2003-2024年的数据正好覆盖了“十五”后期到“十四五”末期你可以把“教育支出占一般公共预算支出比重”或者“节能环保支出占比”按五年规划期做分组均值对比能直接看出政策导向的演变。这个做法写进政策分析类报告里特别加分。3.2 空间维度区域差异、财政自给率与城市分组对比地级市财政数据最能说明问题的指标之一是财政自给率也就是“一般公共预算收入/一般公共预算支出”。这个比值大于1说明这个城市靠自己赚的钱就能覆盖支出财政健康状况好比值长期小于0.5的基本就是高度依赖上级转移支付的地区。计算方式很简单df[self_sufficiency] df[一般公共预算收入] / df[一般公共预算支出]但解读的时候一定要结合区域背景。东部发达地级市财政自给率可以常年维持在0.8以上而西部和东北一些资源枯竭型城市可能只有0.3左右。这些差异本身就是经济学研究的核心素材你可以按东部/中部/西部/东北四大板块做分组箱线图看22年间财政自给率分布的变化。空间维度还可以做区位熵分析。比如你想知道哪些城市是“税收富集型”城市可以计算某个税种占当地总税收的比重再除以全国该税种占总税收的比重区位熵大于1说明该城市在这个税种上有相对优势。比如对增值税做区位熵分析能识别出制造业集聚城市对个人所得税做区位熵能识别出高收入服务业集聚城市。3.3 面板数据回归初探用固定效应模型吃透“城市-年份”变异如果你有经济学或统计学基础拿到这么好的面板数据不做固定效应回归真的浪费。地级市财政数据最常见的分析套路是研究某项财政支出对经济增长、居民收入或者企业投资的影响。因为你是用全市层面的数据所以建议至少控制城市固定效应和年份固定效应。用statsmodels或者linearmodels库都可以做固定效应模型。linearmodels的PanelOLS更直观但要求数据必须设置成MultiIndex。我一般这样操作from linearmodels.panel import PanelOLS df df.set_index([city_code, year]) model PanelOLS.from_formula( gdp_growth ~ edu_share health_share EntityEffects TimeEffects, df ) result model.fit(cov_typeclustered, cluster_entityTrue) print(result.summary)这里edu_share是教育支出占一般公共预算支出的比重health_share是卫生健康支出占比。如果你用的是聚类稳健标准误记得聚类层级选在城市层面因为同一城市的干扰项通常存在序列相关。跑完之后一定要看观测值数量如果明显少于城市数乘以年数说明清洗环节有样本丢失要回去检查是不是把含缺失值的城市整组都丢了。这里我也想多说一句财政支出占GDP的比重也就是财政支出规模变量在做回归时经常会出现内生性问题——经济越好的城市财政支出越多同时GDP增速也受其他因素影响直接回归很容易得到虚假的正相关。所以如果你不是专门研究财政规模与增长关系的建议把财政支出占GDP比重当作控制变量时一定要谨慎解释系数。4. xlsx文件实操拿到一份打不开、读不了的财政数据怎么办4.1 文件打不开的几种情况与排查顺序说实话我每年帮人处理数据至少有三分之一的时间耗在解决文件读取问题上而不是分析本身。关于xlsx文件最常见的情况无非这么几种。第一种是文件损坏。比如用微信或者QQ传文件时传输中断或者网盘下载下来文件大小不到1MB原始文件几十MB那基本就是没下载全。这时候别急着用代码硬读先试试用WPS能不能打开WPS打不开再试Excel如果两个办公软件都打不开大概率文件本身坏了直接让数据提供方重新发一遍。第二种是文件后缀名与实际格式不匹配。有的文件看着是.xlsx实际可能是.xls的老文件改了个后缀甚至有可能是CSV转换时弄出来的假xlsx。判断方法是先看文件大小再用Python直接读取.xlsx读取报BadZipFile错误的话可以把文件后缀改回.xls再用pd.read_excel(enginexlrd)试试。第三种是xlsx的Sheet名编码问题。国内很多数据源做导出时Sheet名会把年份写成“2003年地级市财政”中间还带个全角空格或者干脆是“Sheet1”、“Sheet2”。你直接用Python读取时经常报Worksheet named 2003 not found。我的习惯是不管Sheet名直接一次性读取全部Sheet进来然后根据内容里的年份列去识别而不是依赖Sheet名。4.2 pandas读取的性能问题千万行级数据怎么提速地级市财政数据如果做到最细科目粒度可能达到几十万行普通pandas读取完全没问题。但如果你把全国所有地级市22年每个科目都拆成单独的行行数会接近百万级别。这个量和真正的大数据没法比但如果你还用Excel手工筛选卡死是必然的。如果遇到读取特别慢的情况先看文件大小。超过100MB的xlsxpd.read_excel性能会比较差内存占用也高。我的建议是先用openpyxl的只读模式读取一个小Sheet或者直接先把xlsx转成CSV再读。import openpyxl wb openpyxl.load_workbook(large_file.xlsx, read_onlyTrue) ws wb[Sheet1] # 先看前10行确认表头结构 for i, row in enumerate(ws.iter_rows(min_row1, max_row10, values_onlyTrue)): print(i, row) wb.close()还有一个常见坑是pandas在读取xlsx时会自动把数字列转成浮点数导致城市代码、年份这类本该是整数的列出现.0比如“110000”变成“110000.0”。如果你发现城市代码列读进来变成浮点了一定记得在读取时加dtype{city_code: str}参数或者在读取后把列转成字符串再填充前导零。4.3 用xlwings处理WPS与Excel兼容问题很多人不懂为什么同一个文件在自己电脑的WPS里创建并保存后发给同事用Excel打开时格式会乱甚至用Python读取时会丢数据。原因是WPS在保存为xlsx格式时某些自定义属性、图表、透视表会写入兼容性较差的扩展标记而pandas的openpyxl引擎在读这些文件时偶尔会报错AttributeError: NoneType object has no attribute text。如果你在单位用的是WPS又需要生成一个让用Excel的人也能顺利打开的xlsx我最推荐的方案是装一个xlwings库。这个库可以直接调用你本机安装的WPS或者Excel作为引擎去读写文件生成的文件格式完全兼容不会出现Python生成的xlsx在WPS里打开后样式错乱的问题。import xlwings as xw # 启动WPS应用如果你的默认程序是WPS app xw.App(visibleFalse) app.books.open(地级市财政收支明细.xlsx) # 做一些自动化操作比如把单位统一成万元 sheet app.books.active.sheets[0] sheet.range(F2:F10000).value sheet.range(F2:F10000).value / 10000 app.books.active.save() app.quit()用xlwings还有一个好处就是你可以把生成的分析结果直接写回原来的Excel模板保持原有格式这对做报表交付给不熟悉Python的同事来说非常友好。4.4 在线预览与分享你的数据文件为什么在别人那里无法预览最后聊一个很多人忽略的细节。你在QQ群、钉钉群或者企业微信里发送了一个xlsx文件对方点开显示“该文件类型暂不支持预览请下载后查看”这可能不是你文件的问题而是接收平台本身不支持在线预览xlsx。国内很多办公平台对office文档的在线预览支持并不完整尤其是macOS系统上QuickLook对xlsx的兼容性有时候也不稳定。如果你需要让对方快速查看数据摘要而不一定非要下载整个大文件我有两个建议第一把核心结果单独导出一个PDF版本PDF是所有平台都能预览的第二如果只能用xlsx那发送前把大文件拆分把明细Sheet和汇总Sheet分开明细表单独保存成一个新xlsx这样即使预览不了对方下载打开也不至于卡死。还有一个经验是文件名不要用特殊符号比如全角括号、#号、符号这些字符在某些在线预览和网盘系统里会被转义导致无法识别。文件名尽量用“年份_城市_指标”这种下划线分隔模式兼容性最好。5. 实操复盘一次完整的地级市财政数据处理案例5.1 场景与目标从原始文件到一份可用的面板数据这里我用摸底数据为例。假设需求是给一份2003-2024年地级市财政收支明细xlsx想整理出每个地级市每年的一般公共预算收入、税收收入、教育支出、卫生健康支出和社会保障支出这五个核心指标并生成一个可供后续分析用的Excel结果表。这个场景非常典型论文里经常用到。原始文件可能有多个Sheet每个Sheet对应一年每个Sheet里又有几十行科目明细和几百列城市数据。第一步先读取所有Sheet纵向合并然后筛选科目再宽表转长表。import pandas as pd file_path 地级市财政收入支出明细_2003_2024.xlsx raw_sheets pd.read_excel(file_path, sheet_nameNone) # 每个Sheet的第一列是科目后续列是城市代码或城市名称 df_list [] for sheet_name, df in raw_sheets.items(): year int(sheet_name[:4]) # 假设前几列是科目信息后续列是各个城市 df df.melt(id_vars[科目代码, 科目名称], var_namecity, value_namevalue) df[year] year df_list.append(df) df pd.concat(df_list, ignore_indexTrue) df df[df[科目名称].isin([ 一般公共预算收入, 税收收入, 教育支出, 卫生健康支出, 社会保障和就业支出 ])]这段代码最核心的是melt它把宽表转成长表这样后续按城市和年份筛选就非常方便。运行完之后你要检查一下每个科目每个年份的样本量是否一致如果有某一年某科目的样本量骤减说明那个Sheet的列名或者结构有问题需要回去单独看。5.2 结果导出与交付一屏能看懂的统计结果才有价值最后一步是把结果输出成xlsx但这个输出不是简单地把DataFrame写进去就完事。我会输出两层第一层是明细数据就是城市、年份、指标、数值这种标准长表方便后续任何人用Excel透视表做二次筛选第二层是汇总分析包括每个省份每年的核心指标均值、中位数、总值用另一个Sheet保存并加一个“说明”Sheet把清洗口径、缺失值处理方式、单位说明写清楚。写汇总表的时候我会用pivot_table先做一个城市×年份的宽表然后对各省做聚合并加一个“历年变化率”的列。这样对方拿到文件后不需要任何代码用Excel筛选就能看到有效信息。# 长表转宽表便于查看 wide_df df.pivot_table(index[city, year], columns科目名称, valuesvalue, aggfuncsum).reset_index() # 按省份汇总示例城市名称前两位或者省份映射字段 wide_df[province] wide_df[city].str[:2] province_summary wide_df.groupby([province, year])[[一般公共预算收入, 税收收入]].sum().reset_index() with pd.ExcelWriter(地级市财政核心指标_干净版.xlsx) as writer: wide_df.to_excel(writer, sheet_name城市年度明细, indexFalse) province_summary.to_excel(writer, sheet_name省份汇总, indexFalse)这只是一个最基础的交付结构实际你可以按需扩展。但有一件事一定要记住输出的xlsx文件里数字格式一定要设置为带千分位的数值格式不要保留太长的浮点数同时年份列用整数格式城市代码列用文本格式并保留前导零。这些用Excel打开看的人才会觉得“这表是专业的”而不是“这人是从Python里一键导出的吧”。6. 别人没告诉你的数据解读细节6.1 财政收支统计数据不是“财务会计”而是“预算执行情况”这是很多新手最容易犯的误会。财政收入支出明细里的“收入”、“支出”并不是企业财务报表里的收入成本而是政府预算执行的结果。它包含的是一般公共预算、政府性基金预算、国有资本经营预算、社会保险基金预算这四本账严格来说地级市层面的“财政总收入”经常是四本账中的一般公共预算收入加上政府性基金收入。如果你看到标题只有一个笼统的“财政收支”一定要先明确它到底覆盖哪几本账。不同口径的数据数值差异巨大。2024年有些城市的一般公共预算收入是几百亿但政府性基金收入能高出一倍多因为土地出让金就归在政府性基金账户里。如果杂志或者报告说“某市2024年财政收入破千亿”你一定要先查它说的是一般公共预算收入还是全口径收入。这两者完全是两码事在写分析报告时也要在指标定义里明确写清楚不要给读者留下含糊的空间。6.2 数据背后的“真实含义”增速下滑可能不是坏事有些城市的一般公共预算收入增速在下滑不一定意味着经济变差也可能是主动减税降费的政策结果。有些城市支出增速远超收入增速也不一定是财政管理有问题可能是承接了中央和省级重大项目需要地方配套资金。所以财报分析时一定要结合其他经济数据一起看比如GDP、固定资产投资、社会消费品零售总额等单纯看财政收支很容易得出错误结论。我自己的习惯是拿到财政数据后第一件事是计算两个比率财政收入占GDP比重和财政支出占GDP比重。前者反映了地方政府从经济中提取资源的能力后者反映了地方政府在经济中配置资源的能力。这两个比率合起来看能对一座城市的政府在经济中的作用有个基本判断。6.3 别过度解读单个年份的波动面板数据21年、22年个别年份出现异常波动太正常了。比如2020年疫情导致全国大部分城市的财政收入出现负增长但这不代表所有城市的经济基本面都出了问题。2021年又出现普遍的高增长因为上年基数低。这类“基数效应”在数据解读里是最容易踩的坑尤其是2020-2022年这三年每一年的同比增速都得拿放大镜看否则你会把某些城市简单的周期性波动解读成结构性趋势。遇到这种情况我的建议是用三年移动平均或者按五年规划期做均值对比能平滑掉大多数短期冲击。另一个方法是关注各个城市在同一个年份里的相对排名排名比绝对值更稳健因为同年份的宏观冲击对所有城市是相似的排名能剔除一部分共同冲击。7. 常见问题排查速查表问题表现可能原因排查方向与处理方式pandas读取xlsx报BadZipFile文件不是真正的xlsx格式改后缀为.xls或用WPS另存为真正的xlsx读取后城市代码变成浮点数dtype未指定读取时加dtype{city_code: str}城市名有“市”和“地区”两种叫法区划调整或者统计资料口径不一先统一城市名和代码映射建议以代码为准某个城市某年数据完全缺失该城市可能当年未设地级市检查行政区划沿革确认后决定剔除或保留收入总计不等于分项之和分项里漏了“其他收入”或混入转移性收入回到原始表检查必要时单独列出“其他收入”同一张表里万元与亿元混用录入时单位不统一根据数值分布做单位统一统一为万元用Excel打开xlsx格式错乱WPS兼容性标记导致用xlwings调用WPS另存为标准xlsx或另存为xls文件在聊天软件里无法预览平台不支持该类型预览导出PDF版本或按Sheet拆分文件后发送read_excel读取超慢文件过大或Sheet数过多改CSV读取或者先用openpyxl只读模式分离Sheet这个速查表只是碰到问题时的起点排障的原则永远是先定位文件本身的问题再定位代码的问题。很多人一报错就去看报错信息哪个包没装、哪个依赖没配置其实大部分时候文件问题比环境问题多得多。8. 要长期使用的读者建议再补三步这套数据如果只是临时用一次做到上面第七步就够了。但如果你打算在课题里长期使用或者后续要给团队其他人复用我强烈建议你再做三件事。第一把整理好的数据另存一份CSV作为原始档案保存不要直接用xlsx做长期存储。CSV不会因为Excel版本升级、软件兼容问题而变形而且任何编程语言都能直接读。xlsx本质是压缩包内部是XML文件一旦有任何一个节点损坏整个文件都打不开CSV就没有这个问题。第二写一个“元数据说明文档”至少列清楚数据来源、统计口径、单位、缺失值处理方式、行政区划代码调整记录、清洗脚本版本。这份文档的价值在于三个月之后你再翻开这份数据还能想起来当初为什么某个城市某年数据是空的、为什么某年的教育支出异常高。没有这份文档你的数据就是“裸账”谁都不敢信。第三如果你把整理好的数据分享给其他人一定在邮件或者说明里写清“本数据已经清洗可直接用于分析但分析结论需结合各市具体情况复核”。尤其是财政数据统计数据是官方公开资料但任何加工整理品都会带有处理者个人判断这一点必须让使用者知道。我在处理这类数据时最大的体会是花在“把数据弄干净”上的时间从来都不会白费。数据整理得越细后面分析阶段能犯的错就越少。这份2003-2024年地级市财政数据时间跨度足够长空间覆盖面足够全变量维度足够丰富只要你能先把口径、单位、缺失值这三关过了它就是一个能做很多文章的好样本。