赵乾舟 发表于 2021-10-2 19:37:50

斑马救援出勤统计代码

内容来源于更早的一篇帖子 http://zhaoqianzhou.com/forum.php?mod=viewthread&tid=261&extra=page%3D6

from openpyxl import Workbook                         #导入Excel模块
wb = Workbook()                                  #创建一个Excel文件
sheet = wb.active                                  #获取当前sheet名称
sheet.title = "第一个sheet"                        #修改sheet名称
sheet['A1']= "姓名"                                    #在A1 B1单元格输入内容
sheet['B1']= "次数"
import pandas as pd                        #导入pandas库,读csv用的
pd = pd.read_csv('002.csv',encoding='utf-8')      #打开csv文件,读取内容

alllist = '、'.join(pd['参与人员'])            #用顿号拼接人员一列
wordlist = list(alllist.split('、'))             #转成列表格式,以顿号为识别分割符
print(wordlist)                                     #打印列表格式
wordset = set(wordlist)                            #去掉重复内容


newlist = []                                          #创建空列表来存储姓名和次数
for word in wordset:
    freq = wordlist.count(word)                               #计算出现次数
    sheet.append()                                 #把内容添加到sheet
    newlist.append()                              #把内容加入空列表


newlist = sorted(newlist,key=lambda k:k,reverse=True)#给列表排序
wb.save( "测试3.xlsx")
print(newlist)


赵乾舟 发表于 2021-10-2 20:55:25

最新积分细则代码,目前处于测试阶段
# 导入excel模块,
from openpyxl import Workbook                         #导入Excel模块
wb = Workbook()                                  #创建一个Excel文件
sheet = wb.active                                  #获取当前sheet名称
sheet.title = "斑马救援积分明细"                        #修改sheet名称
sheet['A1']= "姓名"                                    #在A1 B1单元格输入内容
sheet['B1']= "分数"

# 导入pandas库,读取表格
import pandas as pd
#pd = pd.read_csv('002.csv',encoding='utf-8')      #打开csv文件,读取内容
pd = pd.read_excel('002.xlsx')                  #打开excel文件,读取内容
#分别拿出参与人员和出勤类型数据,为创建元组做准备
alllist = ','.join(pd['参与人员'])            #用逗号拼接人员一列,此处生成不是列表,是字符串
alllist = list(alllist.split(','))             #把上一步的字符串转成列表格式,以逗号为识别分割符
classlist = '、'.join(pd['出勤类型'])      #拼接出勤类型成字符串
classlist = list(classlist.split('、'))    #把拼接出来的字符串转成列表

dalist = []               #创建一个空列表存放所有的姓名(重复姓名都在这里边)
b = []                      #创建空列表存放去重后的姓名
# 创建元组,让出勤类型和出勤人员一一对应
zidian = zip(classlist,alllist)
# 循环元组内容,判断哪种类型应该积分多少
for i in list(zidian):
    if i == '第一类1分':
      dalist.append(i.split('、'))
    elif i == '第二类2分':
      dalist.append(i.split('、')*2)
    elif i == '第三类3分':
      dalist.append(i.split('、')*3)

#这一步,把大列表里面嵌套的小列表,全部清空,只把姓名拿出来放到一个列表b里
for a in dalist:
    b.extend(a)

name = set(b)   #人员去重,每个名字只留下一个

newlist = []                                          #创建空列表来存储姓名和次数
for word in name:
    freq = b.count(word)                               #计算出现次数
    sheet.append()                                 #把内容添加到sheet
    newlist.append()                              #把内容加入空列表


newlist = sorted(newlist,key=lambda k:k,reverse=True)#给列表排序
wb.save( "积分明细.xlsx")
print(newlist)



赵乾舟 发表于 2021-10-5 14:06:15

相比于楼上,增加了excel行数的读取,和处理数据的计算,通过对比两个数字,来判断是否全部数据都处理完。
# 导入openpy模块,操作最后一步导出excel
from openpyxl import Workbook                         #导入Excel模块
wb = Workbook()                                  #创建一个Excel文件
sheet = wb.active                                  #获取当前sheet名称
sheet.title = "斑马救援积分明细"                        #修改sheet名称
sheet['A1']= "姓名"                                    #在A1 B1单元格输入内容
sheet['B1']= "分数"

# 导入pandas库,读取表格
import pandas as pd
#pd = pd.read_csv('002.csv',encoding='utf-8')      #打开csv文件,读取内容
pd = pd.read_excel('全部记录.xlsx')                  #打开excel文件,读取内容
linesnum = pd.index.stop               #excel数据行数
#分别拿出参与人员和出勤类型数据,为创建元组做准备
alllist = ','.join(pd['参与人员'])            #用逗号拼接人员一列,此处生成不是列表,是字符串
alllist = list(alllist.split(','))             #把上一步的字符串转成列表格式,以逗号为识别分割符
classlist = '、'.join(pd['积分类型'])      #拼接出勤类型成字符串
classlist = list(classlist.split('、'))    #把拼接出来的字符串转成列表
x = 0                           #储存处理数据的数目
dalist = []               #创建一个空列表存放所有的姓名(重复姓名都在这里边)
b = []                      #创建空列表存放去重后的姓名
# 创建元组,让出勤类型和出勤人员一一对应
zidian = zip(classlist,alllist)
# 循环元组内容,判断哪种类型应该积分多少
for i in list(zidian):
    if i == '1分':
      dalist.append(i.split('、'))
      x = x + 1
    elif i == '2分':
      dalist.append(i.split('、')*2)
      x = x + 1
    elif i == '3分':
      dalist.append(i.split('、')*3)
      x = x + 1
    else:
      print(f'积分类型为{i}的数据有问题')
#这一步,把大列表里面嵌套的小列表,全部清空,只把姓名拿出来放到一个列表b里
for a in dalist:
    b.extend(a)

name = set(b)   #人员去重,每个名字只留下一个

newlist = []                                          #创建空列表来存储姓名和次数
for word in name:
    freq = b.count(word)                               #计算出现次数
    sheet.append()                                 #把内容添加到sheet
    newlist.append()                              #把内容加入空列表


newlist = sorted(newlist,key=lambda k:k,reverse=True)#给列表排序

#用excel行数对比处理的数据,如果一样就说明全部数据已经处理完,如果不同,就说明有的数据没有处理
if linesnum == x:
    print(f'数据处理完毕,共{linesnum}条记录')
    print(newlist)
    wb.save("积分明细.xlsx")
else:
    print(f'共有数据{linesnum},已经处理{x}条,请排查数据')
页: [1]
查看完整版本: 斑马救援出勤统计代码