0%

pandas处理excel

需求

  • 现有一excel如下,需要把日期和金额合并成一行

    image-20211203173955957

  • 最终需要实现效果如下:

    image-20211203174051646

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
import pandas as pd
import math


class OperateExcel():
def __init__(self, file_path):
self.file_path = file_path
# 注意header参数,取值为前面两行
self.df = pd.read_excel(file_path, sheet_name="日记帐", header=[0, 1])

def get_head(self):
"""
头部处理,格式:
:return:
[year, headers]

year为年,如2021年
headers=[],把所有头部值存到[]中,日期 凭证编号 车牌号 拿货吨位 卖出吨位 摘要 收入 支出 余额
"""
headers = []
# 取头部数据
head = self.df.head(0)
year = ""
for items in head:
# ------ 处理日期,取年
for i in items:
if i.find("年") != -1:
year = i
break
# ------- 处理其他头部
if items[1].replace(" ", "").find("Unnamed") != -1:
headers.append(items[0].replace(" ", ""))
# ---- 金额后的头部,只取收入、支出、余额;
if items[0].replace(" ", "").find("金额") != -1:
headers.append(items[1].replace(" ", ""))

headers.insert(0, "日期")
return year, headers

def get_data(self):
"""
处理数据
:return:
[file_name, data]
file_name表示将要保持的名字
data 表示处理好的数据,给pd.DataFrame使用,格式 {"金额":[1,2,3],"收入":[]}
"""

g_head = self.get_head()
headers = g_head[1]
year = g_head[0]
month = ""
data = {}
for i in headers:
data[i] = []
for items in self.df.values:
# 合计不取数据;第一个单元格为空值说明此行为无效数据,也不取值
if items[0] == '合计' or math.isnan(items[0]):
break
# 处理日期值为:2021年1月1日
month = str(items[0]) + "月"
m_date = year + month + str(int(items[1])) + "日"
data["日期"].append(m_date)
# 凭证编号
num = 0
if str(items[2]) != "nan":
num = items[2]
data["凭证编号"].append(num)

# 车牌号
car_num = 0
if str(items[3]) != "nan":
car_num = items[3]
data["车牌号"].append(car_num)

# 拿货吨位
take_tonnage = 0
if str(items[4]) != "nan":
take_tonnage = items[4]
data["拿货吨位"].append(take_tonnage)

# 卖出吨位
sell_tonnage = 0
if str(items[5]) != "nan":
sell_tonnage = items[5]
data["卖出吨位"].append(sell_tonnage)

# 摘要
summary = ""
if str(items[6]) != "nan":
summary = items[6]
data["摘要"].append(summary)

# 收入
revenue = 0
if str(items[7]) != "nan":
revenue = items[7]
data["收入"].append(revenue)

# 支出
spend = 0
if str(items[8]) != "nan":
spend = items[8]
data["支出"].append(spend)

# 余额
balance = 0
if str(items[9]) != "nan":
balance = items[9]
data["余额"].append(balance)

# 生成的文件名
file_name = year + month + ".xlsx"
return file_name, data

def sum_data(self, data):
"""
新增统计处理的数据,最终给pd.DataFrame使用
:param data: list|表示处理好的数据,给pd.DataFrame使用,格式 {"金额":[1,2,3],"收入":[]}
:return: list
"""
for i in data:
# 插入一行空行
data[i].append(0)

# 手动合计拿货吨位、卖出吨位、收入、支出、余额
data["日期"].append("合计")
# data["拿货吨位"].append(sum(map(float,data["拿货吨位"])))
data["拿货吨位"].append(sum(data["拿货吨位"]))
data["卖出吨位"].append(sum(data["卖出吨位"]))
data["收入"].append(sum(data["收入"]))
data["支出"].append(sum(data["支出"]))
data["余额"].append(sum(data["余额"]))
# 对手动合计拿货吨位、卖出吨位、收入、支出、余额、日期之外的合计行,写入空值
for i in data:
if i not in ["日期", "拿货吨位", "卖出吨位", "收入", "支出", "余额"]:
data[i].append("")

# 如果数据为0,填入到excel中不美观,因此改为”“,默认填进去就是不可见
for j in data:
for k in range(len(data[j])):
if data[j][k] == 0:
data[j][k] = ""

return data

def generate_excel(self):
"""
重新生成excel
:return:
"""
g_data = self.get_data()
# 得到要保存的文件名
file_name = g_data[0]
# 得到处理好的数据,不包括统计
l_data = g_data[1]
# 得到处理好的数据,包括统计
s_data = self.sum_data(l_data)
info_marks = pd.DataFrame(s_data)
writer = pd.ExcelWriter(file_name)
info_marks.to_excel(writer, index=False)
writer.save()
print('生成excel成功,文件名为:%s' % file_name)


if __name__ == "__main__":
file_path = 'XXXX.xls'
o_excel = OperateExcel(file_path)
o_excel.generate_excel()

  • 取头部要取两行
  • 注意nan的处理