Python 财务自动化:从 Excel 报表到脚本
不需要学成程序员,会这几个动作就够处理日常报表了。
一、环境
pip install pandas openpyxl
python -c "import pandas; print(pandas.__version__)"
VS Code + Python 插件足够;不想装环境可以用 Jupyter。
二、读表
import pandas as pd
df = pd.read_excel('明细账.xlsx', sheet_name='Sheet1', header=0)
# 只读部分列、跳过前两行标题
df = pd.read_excel('明细账.xlsx', usecols='A:F', skiprows=2)
print(df.head())
print(df.shape, df.dtypes)
CSV 注意编码:
df = pd.read_csv('导出.csv', encoding='gbk') # 中文乱码时换 gbk
三、清洗四件事
df.columns = [c.strip() for c in df.columns] # 列名去空格
df['金额'] = pd.to_numeric(df['金额'], errors='coerce') # 转数字,脏数据变 NaN
df['日期'] = pd.to_datetime(df['日期'], errors='coerce')
df = df.dropna(subset=['金额']) # 去掉金额为空的行
四、合并多份报表(每月最烦的活)
import glob
files = glob.glob('月报/*.xlsx')
frames = []
for f in files:
tmp = pd.read_excel(f)
tmp['来源文件'] = f.split('\\')[-1]
frames.append(tmp)
all_data = pd.concat(frames, ignore_index=True)
all_data.to_excel('合并结果.xlsx', index=False)
五、分组汇总(等价于数据透视表)
summary = (
all_data
.groupby(['部门', '科目'], as_index=False)
.agg(金额=('金额', 'sum'), 笔数=('金额', 'size'))
.sort_values('金额', ascending=False)
)
条件聚合用 pivot_table:
pivot = all_data.pivot_table(
index='科目', columns='月份', values='金额', aggfunc='sum', fill_value=0
)
六、两表比对(勾稽/对账)
book = pd.read_excel('账面.xlsx')
bank = pd.read_excel('银行流水.xlsx')
# 找出账面有、流水没有的
only_book = book.merge(bank, on='流水号', how='left', indicator=True)
only_book = only_book[only_book['_merge'] == 'left_only']
# 金额不一致的
diff = book.merge(bank, on='流水号', suffixes=('_账', '_银'))
diff = diff[diff['金额_账'] != diff['金额_银']]
七、画图(不用开 Excel)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 中文不乱码
pivot.T.plot(kind='bar', figsize=(10, 5))
plt.title('各部门月度费用')
plt.tight_layout()
plt.savefig('费用趋势.png', dpi=150)
八、一个完整的小脚本:费用异动扫描
import pandas as pd
df = pd.read_excel('费用明细.xlsx')
df['月份'] = pd.to_datetime(df['日期']).dt.to_period('M')
pivot = df.pivot_table(index=['部门', '科目'], columns='月份', values='金额', aggfunc='sum', fill_value=0)
mom = pivot.pct_change(axis=1) # 环比
alert = mom[mom.abs() > 0.5].stack() # 波动超过 50%
print(alert.sort_values(ascending=False))
alert.to_excel('异动清单.xlsx')
九、学习建议
- 先把自己的「每月重复劳动」列出来,挑一件用脚本替掉;
- 面试被问「会不会 Python」,说清楚你用它做过什么,比背语法有用;
- 别一上来学类与继承,财务场景 90% 用不到。