出纳银行、现金日记账用pandas实现财务自动化的功能和一些思路
视频讲解请看这里:https://www.bilibili.com/video/BV1CD4y1d7W6/
由于今年疫情和公司环境的变化,公司安排我兼任出纳职位,我本来是搞工程技术的,现在又要兼顾出纳岗位,对财务的东西基本没有什么了解,可以说是一窍不通,小公司为了生存没办法,我只能硬着头皮接下来了,正式交接后才发现工作量不小,发工资、报销费用、收付工程账款、农民工工资发放,社保、医保、还要记账,我看了交接的财务资料一天…懵逼了!
先从日常简单重复的看起,看看能不能用电脑实现一些自动化的操作,解放我的时间,目前有两本手写账簿,一个是《现金日记账》一个是《银行日记账》,摸索了一下,这两个相当于本质上就是出入库账本,就是动钱的时候就要做记录,按月统计余额、收付款数目。那先从这个入手,这两个账本就用python的pandas库来把纸质记录电子化程序化吧。
先看看这两本账的格式,大概都长这个样子,封面不同:


先把数据做成下面的格式,保存成csv文件或者电子表格文件也行,我下面得代码是读取csv格式的:

目前实现的是按月现金类统计(在每个月最后一行添加统计数据,在余额列逐行计算并写入余额),python代码如下:
import pandas as pd
import numpy as py
import datetime#日期计算库
import calendar#日期计算库
def cumsum_data(datax):
data = datax.copy()#拷贝一份,否则赋值会有警告
data.loc[:,"余额"] = data["借方"].cumsum(0) - data["贷方"].cumsum(0) + data["余额"].cumsum(0)#各项的累计:借方-贷方+余额计算出当前余额
jief = data["借方"].sum()
daif = data["贷方"].sum()
ye = jief - daif + data['余额'][0]
#获得数据最后一条得日期
ti = data.index[-1]
# 获取当月第一天的星期和当月的总天数
firstDayWeekDay, monthRange = calendar.monthrange(ti.year, ti.month)
#获取当月最后一天
lastDay = datetime.date(year=ti.year, month=ti.month, day=monthRange)
# 计算出下个月第一天
next_month = lastDay + datetime.timedelta(days=1)
next_month = pd.to_datetime(next_month)#转换数据格式
total = pd.DataFrame([{'日期':next_month,'交易类型':'现金','经办人':'-','凭据编号':'-','摘要':str(data.index.month[-1]) + '月合计','借方':jief,'贷方':daif,'余额':ye}]).set_index('日期')#计算合计行
total1 = pd.DataFrame([{'日期':next_month,'交易类型':'现金','经办人':'-','凭据编号':'-','摘要':str(data.index.month[-1]) + '月余额','借方':0,'贷方':0,'余额':ye}]).set_index('日期')#计算余额行,用于下个月计算
data = data.append(total)#在结尾添加合计行
return data,total1
#df = pd.read_excel('test.xlsx')
df = pd.read_csv('data.csv', encoding = 'gbk')
df['日期'] = pd.to_datetime(df['日期']) #将数据类型转换为日期类型
df = df.fillna(0)
df = df.set_index('日期')
month = list(set(df.index.month)) #利用集函数提取月份,不重复
df_month = df['2020-' + str(month[0])]#df['2020-9']
df_cash = df_month[df_month['交易类型'] == '现金']
df_process,total1 = cumsum_data(df_cash)#计算余额跟合计行
for m in month[1:]:
df_month = df['2020-' + str(m)]#原始数据读取下个月数据
df_cash = df_month[df_month['交易类型'] == '现金']#现金流
df_cash = total1.append(df_cash)#在结尾添加新月份数据
df_process1,total1 = cumsum_data(df_cash)#计算余额跟合计行
df_process = df_process.append(df_process1[1:])#在结尾添加新月份数据,丢弃第一行再合并
df_process.to_csv('现金日记账.csv',encoding = 'gbk')
df_process
输出如下(并根据输出的数据保存一份“现金日记账.csv”的文件):
