第一次工作关键代码总结

批量读取文件夹下xlsx的数据

提前设置好filelocation(存放要读取文件的文件夹),读取到的文件数据保存在all_data里,打印文件夹下xlsx文件总数,显示读取的文件数。

import glob
import pandas as pd
#读取文件的地址
filelocation=filelocation
# filelocation="/Users/quhongchao/Desktop/未命名文件夹 2/"  
#当前文件夹下搜索的文件名后缀  
fileform="xlsx"  
#首先查找默认文件夹下有多少文档需要整合  
filearray=[]  
for filename in glob.glob(filelocation+"*."+fileform):  
    filearray.append(filename)  
#以上是从pythonscripts文件夹下读取所有excel表格,并将所有的名字存储到列表filearray
print("在默认文件夹下有%d个文档"%len(filearray)) 
ge=len(filearray)  
matrix = [None]*ge  
#定义空的DataFrame,接收数据
all_data = pd.DataFrame()
#读取数据
for i in range(ge):
    print(i)
    l_data = pd.read_excel(filearray[i])
    all_data = all_data.append(l_data)

去掉列表中部分数值前面的特殊字符

all_data['商户姓名']=all_data['商户姓名'].apply(lambda x:x.replace('\n', '').replace('\r', ''))

时间的显示方式

data['交易时间'] = pd.to_datetime(
    data.交易时间, 
    format='%Y/%m/%d')

做汇总,t1 是第一次交易的时间,t2为最后一笔交易的时间。

money=data.groupby('ming')['交易金额'].sum()
t1=data.groupby('ming')['交易时间'].min()
t2=data.groupby('ming')['交易时间'].max()
h3=data.groupby('ming')['sn编码']
aaaa=[]
for i in h3:
    a1=i[1].tolist()
    b=a1[0]
    c=str(b)
    aaaa.append(c)

df={'名字':money.index,'sn编码':aaaa,"第一笔交易的时间":t1,"最后一笔交易的时间":t2,"累计刷卡金额":money}
DF=pd.DataFrame(df)

# t3=t2-t1
DF['活跃天数']=t2-t1
DF['活跃月数']=round(DF['活跃天数']/pd.Timedelta(days=30),1)
DF['平均月刷卡金额']=round(DF['累计刷卡金额']/DF['活跃月数'],1)
# DF['沉默天数']=pd.datetime.now()-DF['最后一笔交易的时间']
# DF['沉默天数']=pd.to_datetime("2021-9-1")-DF['最后一笔交易的时间']
DF['沉默天数']=pd.to_datetime(suanchentime)-DF['最后一笔交易的时间']
#组合列还原原始信息
DF['商户姓名']=DF['名字'].map(lambda x:x.split("&")[0])
DF['合伙人姓名']=DF['名字'].map(lambda x:x.split("&")[1])
DF['商户编号']=DF['名字'].map(lambda x:x.split("&")[2])
DF['合伙人编号']=DF['名字'].map(lambda x:x.split("&")[3])

#按照某列条件对另一列赋值
DF.loc[DF['活跃月数']<1,['平均月刷卡金额']] = 0
DF.loc[DF['活跃月数']<1,['备注']] = "——"

M=DF[DF["沉默天数"]>pd.Timedelta(days=60)]
H=DF[DF["沉默天数"]<pd.Timedelta(days=60)]

按照客户总数降序排列

CCC=CC.sort_values(by= ['客户总数'],ascending=False)

对合伙人、商户按照对应关系做年、月交易额汇总

qe1=pd.pivot_table(data,index=['合伙人姓名和编号','商户姓名和编号',
data.交易时间.map(lambda x:x.year),
data.交易时间.map(lambda x:x.month)],
values='交易金额',aggfunc=np.sum)

将数据存入Excel


with pd.ExcelWriter(savepath+name+'team.xlsx') as writer:
    str1 = ['活跃','沉默',"客户沉默率","月交易金额汇总"]
    HH.to_excel(writer, sheet_name= str1[0],index=False)
    MM.to_excel(writer, sheet_name= str1[1],index=False)
    CCC.to_excel(writer, sheet_name= str1[2],index=False)
#     qe1.to_excel(writer, sheet_name= str1[3])
writer.save()
writer.close()

将数据按照固定格式存储到Excel 中

导入需要的库

from openpyxl import load_workbook
from openpyxl.utils import get_column_letter 
from openpyxl.styles import Font,Border,Side,PatternFill,Alignment
from openpyxl.styles import numbers
import datetime

读取excel文件

wb = load_workbook(savepath)#使用openpyxl读取xlsx文件,创建workbook
ws = wb.active

原本时间为“2020/12/28 14:27:51”形式,只显示年月日,
金额保留一位小数且以万为单位,
月数那一列在原本数字的后面加“个月‘两个字,
天数那一列保留整数加‘天’字

#定位表单
ws1 = wb["活跃"]

#改时间  改百分数显示
rownum1=str(ws1.max_row)
print(rownum1)
for i in range(1,int(rownum1)+1):
    ws1.cell(row=i, column=7).number_format ='yyyy-mm-dd'

for i in range(1,int(rownum3)+1):
    ws3.cell(row=i, column=7).number_format ='0%'
    
    
for i in range(1,int(rownum2)+1):
    ws1.cell(row=i, column=9).number_format ="0!.0,万" 
for i in range(1,int(rownum2)+1):
    ws1.cell(row=i, column=11).number_format ='General,个月'
for i in range(1,int(rownum2)+1):
    ws1.cell(row=i, column=12).number_format ='0!天'


for i in range(1,int(rownum2)+1):
    ws2.cell(row=i, column=6).number_format ='@'

设置行高列宽

# 设置行高列宽
ws1.row_dimensions[1].height=55

for i in range(2,int(rownum1)+1):
    ws1.row_dimensions[i].height=36
        
ws1.column_dimensions['A'].width=7

加边框线

# 边框线
border_set = Border(left=Side(border_style='thin', color='000000'),
                    right=Side(border_style='thin', color='000000'),
                    top=Side(border_style='thin', color='000000'),
                    bottom=Side(border_style='thin', color='000000'))

# 给ws2第一列数据加边框
col = ws2['A']
for cell in col:
    cell.border = border_set

for row in ws1['A2:H'+str(int(rownum1)+1)]:
    for cell in row:
        cell.alignment = Alignment(horizontal='center',vertical='center',wrap_text=True)

for row in ws4["A1:F"+rownum4]:
    for cell in row:
        cell.border = border_set

设置字体

font1 = Font(u'宋体',size = 12,bold=True,italic=False,strike=False,color='000000')#12B
font2 = Font(u'宋体',size = 14,bold=True,italic=False,strike=False,color="ff0000")# 14 红 B


#改字体格式 表头居中 ws3处理完
ws1['A1'].font = font1

for i in range(2,int(rownum1)+1):
    ws1.cell(row=i, column=1).font = font1

设置水平居中,垂直居中,自动换行

# 水平居中,垂直居中,自动换行
ws1['A1'].alignment = Alignment(horizontal='center',vertical='center',wrap_text=True)

合并单元格

ws3.merge_cells('A1:G1')

架构

数据预处理

for i in name:
    data[i].fillna('WWWWWWW',inplace=True)

生成tag形式的套着字典的列表,dengji,tuijian,hehuoren都是列表

tag = [{'id': 1,  'code': '1000', 'parentCode': 'null'},
       {'id': 2, 'code': '1010', 'parentCode': '1000'},
       {'id': 3, 'code': '1011', 'parentCode': '1000'},
       {'id': 4,  'code': '1111', 'parentCode': '1011'},
       {'id': 5,  'code': '1112', 'parentCode': '1011'},
       {'id': 6,  'code': '2000', 'parentCode': 'null'},
       {'id': 7,  'code': '2010', 'parentCode': '2000'},
       {'id': 8, 'code': '2111', 'parentCode': '2010'}]
zong=[]
for i in range(len(dengji)):
    dict1={'dengji':dengji[i],'tuijian':tuijian[i],'hehuoren':hehuoren[i]}
    zong.append(dict1)

以tag形式的数据为基础
生成层级结构的json树

def one(tag):
    pl =[]
    for i in tag:
        if i['tuijian'] == '喔**部&C004':
            i['children'] = two(tag,i)
            pl.append(i)
    return pl
#     print(pl)
def two(tag,parent):
    cl=[]
    for i in tag :
        m={}
        if i['tuijian'] == parent['hehuoren']:
            cl.append(i)
            i['children'] = two(tag,i)
    return cl
one(zong)

json 数据的保存与打开

#cunchu 
import json 
#baocun为要存储的数据
with open ("baocun.json",'w')as file_obj:
    json.dump(baocun,file_obj)
    
 #dakai 
 with open('')as file_obj:
     name=json.load(file_obj)
 print(name)

Excel 字母到序号的转化,列数和序号数的变化

from openpyxl.utils import get_column_letter, column_index_from_string
 
def to_excel序号_字母(数字):
    if isinstance(数字,str): return 数字
    return get_column_letter(数字)
def to_excel序号_数字(字母):
    if isinstance(字母, int): return 字母
    return column_index_from_string(字母)
 
def get_excel序号_列表(开头序号_字母或数字__包括开头,结尾序号_字母或数字__包括结尾,生成字母列表=True):
    开头序号 = to_excel序号_数字(开头序号_字母或数字__包括开头)
    结尾序号 = to_excel序号_数字(结尾序号_字母或数字__包括结尾)
    返回列表 = []
    for i in range(开头序号,结尾序号+1):
        返回列表.append(i)
    if 生成字母列表:
        返回列表 = stream(返回列表).map(lambda i: to_excel序号_字母(i)).collect()
    return 返回列表

设置列宽

for i in range(84):
    a=to_excel序号_字母(i+1)
    ws.column_dimensions[a].width=33

合并单元格

#合并第a列相同的信息,a为列号
def hebing(a):
        # 需要处理的文件
#     file = r'86ji.xlsx'
#     wb = load_workbook(file)
#     # 数据存放的工作表'Sheet1'
#     ws = wb['Sheet1']

    # 获取第一列数据
    type_list = []
    i = 2
    while True:
        r = ws.cell(i, a).value
        if r:
            type_list.append(r)
        else:
            break
        i += 1
#     print(type_list)
    # 判断合并单元格的始末位置
    start = 0
    end = 0
    flag = type_list[0]
#     print(flag)
    for i in range(len(type_list)):
        if type_list[i] != flag:
            flag = type_list[i]
            end = i - 1
            if end >= start:
                ws.merge_cells(to_excel序号_字母(a) + str(start + 2) + ":" +to_excel序号_字母(a)+ str(end + 2))
                start = end + 1
        if i == len(type_list) - 1:
            end = i
            ws.merge_cells(to_excel序号_字母(a) + str(start + 2) + ":"+to_excel序号_字母(a) + str(end + 2))

  
for i in range(83):
    print(i)
    hebing(i+1)

生成映射字典,将某些值替换

hehuoren3=D.合伙人编号姓名手机号.tolist()
hehuoren1=D.合伙人姓名.tolist()
dictmap=dict(zip(hehuoren3,hehuoren1))
a=f1.applymap(lambda s: dictmap.get(s) if s in dictmap else s)
D['bianma']=D['推荐'].map(lambda x:x.split("&")[-1])

字典的键值反转


#键值反转

reverse_dict1 = dict([(value,key) for (key,value) in dict1.item()])

将一列的值按照对应关系转换

D['bianma'] = D['bianma'].map(temp)

列换名字

D.rename(columns={'bianma':'tuijian'})
上一篇:xml数据传输


下一篇:java 读取Excel百分数保留原格式(即不转换为小数)的方法