最全Python操作excel代码,让你每天早下班两小时

在数字化时代,很多人工作中经常和excel打交道。本文介绍Python操作excel的脚本,让你工作效率更高。

一、安装openpyxl模块

Python操作excel主要用到了openpyxl模块,按win+R打开cmd,在里面输入

pip3 install openpyxl

即可成功安装openpyxl模块。

二、加载库

接着加载库,并设置数据存放的文件夹。

import os
import random
import openpyxl
import numpy as np
import pandas as pd
from openpyxl.drawing.image import Image
from openpyxl.worksheet.table import Table,TableStyleInfo
from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment
from openpyxl.utils import get_column_letter,column_index_from_string
#导入库

os.chdir(r'G:/python/13_python处理excel/')
#设置文件存放的地址

三、创建文件和工作表

接着创建文件和工作表,代码如下:

wb = openpyxl.Workbook()
#创建工作表
wb_sht1 = wb.create_sheet(title='插入数据', index=0)
wb_sht2 = wb.create_sheet(title='插入表格', index=0)
wb.save('cs.xlsx')
wb.close()

得到结果:

也可以用函数删除工作表,代码如下:

wb.remove(wb_sht1)

四、在工作表指定单元格写数据

接着在工作表中写数据,代码如下:

#在每一行写入行号
wb = openpyxl.Workbook()
#创建工作表
wb_sht1 = wb.create_sheet(title='插入数据', index=0)
wb_sht2 = wb.create_sheet(title='插入表格', index=0)
for r_index in range(1, 10):
    for c_index in range(1, 10):
        wb_sht1.cell(row=r_index, column=c_index, value=r_index)

两层for循环控制在相应位置写下行号,得到结果:

五、设置单元格的颜色字体

接着在A1单元格测试设置字体大小、颜色、边框线条,代码如下:

thin = Side(border_style="thin", color="FF0000")
#红色细线条
double = Side(border_style="double", color="000000")
#黑色粗线条
wb_sht1_A1 = wb_sht1["A1"]
#选择要调整颜色的单元格
wb_sht1_A1.font = Font(b=True, color='008000')
#设置单元格字体颜色
wb_sht1_A1.alignment = Alignment(horizontal='left', vertical='center')
#设置单元格排列方式
wb_sht1_A1.border = Border(top=double, left=thin, right=thin, bottom=double)
#设置边框线条
wb_sht1_A1.fill = PatternFill("solid", fgColor="0000FF")
#设置单元格填充颜色

得到结果:

六、在excel中写入表格

最后在excel中写入表格,代码如下:

os.chdir(r'G:/python/13_python处理excel/')
#设置文件存放的地址
wb = openpyxl.Workbook()
#创建工作表
wb_sht1 = wb.create_sheet(title='插入数据', index=0)
wb_sht2 = wb.create_sheet(title='插入表格', index=0)
date = pd.DataFrame(np.random.randint(20, 50, (4, 4)))
col_name = ['col1', 'col2', 'col3', 'col4']
date.columns = col_name
wb_sht2.append(col_name)
for row in range(date.shape[0]):
    wb_sht2.append(list(date.iloc[row, ]))
table = Table(id=1, displayName='excel_table3', ref='A1:D4')
wb_sht2.add_table(table)
wb.save('cs1.xlsx')
wb.close()

得到结果:

至此,用Python中的openpyxl模块操作excel代码已讲解完毕。感兴趣的小伙伴可以更深入地测试这些代码。

本文只给出了基础代码,更多特殊需求,可以在此代码的基础上进行调整。

如果想在excel中设置好格式,只把数据粘贴到文档中,还可以调用xlwings模块进行excel操作。

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
若有侵权,请联系删除
<think>嗯,用户想用Python处理Excel数据,统计每人每天上班后在闸机外的时间,还有夜班的情况。首先,我需要理清楚整个流程。用户的需求是从Excel导入数据处理之后计算每个人每天在闸机外的时间,也就是可能迟到或者退的时间?或者是指他们进入公司后还在外面的时间?可能需要更明确的需求,但假设是统计从上班时间到进入闸机的时间差。 首先,数据导入部分,可能需要用pandas库读取Excel文件。数据应该包含员工ID、日期、进出闸机的时间以及班次类型(比如白班或夜班)。用户提到有夜班的情况,所以处理时间的时候需要考虑不同的班次时间段。比如夜班可能从晚上开始到次日凌晨,这样日期可能会跨天,处理的时候需要特别注意。 接下来,处理数据。可能需要将每个员工的打卡记录按日期和班次进行分组。对于夜班员工,可能他们的上班日期需要调整,比如从晚上20点到次日4点,这种情况下,上班日期应该算作前一天的日期,或者根据公司的具体规定来调整日期归属。 然后,计算闸机外的时间。比如,如果员工的上班时间是9:00,而他们实际进入闸机的时间是9:15,那么闸机外的时间就是15分钟。但如果是夜班,比如上班时间是22:00,打卡在22:30,那么同样需要计算30分钟。这里需要明确每个班次的标准上班时间,可能需要有一个班次时间表,比如白班9:00-17:00,夜班22:00-6:00之类的。 可能需要的数据处理步骤包括: 1. 读取Excel文件,处理可能的日期时间格式问题。 2. 根据班次类型(白班/夜班)确定每个员工的上班时间。 3. 对于每个员工每天的最打卡时间,计算与应上班时间的差值。 4. 如果有多次打卡,可能需要确定最接近上班时间的那次,或者是否有多次进入的情况,但用户需求是统计上班后的闸机外时间,可能需要明确“闸机外”的定义,是否指上班后还未进入的时间,或者下班后离开的时间?需要进一步确认,但根据问题描述,应该是上班后进入闸机的时间延迟。 假设问题是指员工上班后到达闸机的时间,即他们应该在某个时间点上班,但实际进入闸机的时间可能晚于这个时间,统计这部分延迟时间。例如,白班9点上班,员工在9:10进入,那么闸机外时间是10分钟。夜班同理,比如夜班22点上班,员工在22:05进入,则5分钟。 因此,步骤可能是: - 数据导入:用pandas读取Excel处理日期时间列。 - 数据清洗:确保时间格式正确,处理缺失值。 - 确定每个员工的班次对应的上班时间。 - 对每个员工每天数据,找到当天的首次进入闸机时间。 - 计算首次进入时间与应上班时间的差值,得到闸机外时间。 - 处理跨天情况,特别是夜班可能跨到次日的情况,可能需要将日期调整到正确的上班日期。 需要注意的是,如果员工的打卡记录在同一天有多次进入,可能需要取最的一次来计算是否迟到,或者根据具体规则处理。例如,员工可能在上班时间前进入,然后在上班时间后又出去,这时候可能需要不同的处理方式。但根据用户的问题,可能只需要考虑上班后的首次进入时间。 另外,关于夜班的日期处理,比如夜班从2023-10-10 22:00到2023-10-11 06:00,那么该班次的日期可能归属于2023-10-10,因为虽然结束在次日,但上班时间是从前一天晚上开始的。因此,在统计时,可能需要将夜班的日期归为开始的那一天。 代码方面的大致步骤: 1. 导入必要的库:pandas, datetime等。 2. 读取Excel数据,转换为DataFrame。 3. 转换时间列为datetime类型。 4. 根据班次类型(白班/夜班)确定每个记录的上班日期和应上班时间。 5. 对每个员工和日期,筛选出对应的打卡记录。 6. 计算闸机外时间。 7. 汇总统计结果,输出到Excel或其它格式。 可能的代码示例: ```python import pandas as pd from datetime import datetime, timedelta # 读取Excel数据 df = pd.read_excel('打卡记录.xlsx') # 假设列名包括:员工ID、打卡时间、班次类型('白班'/'夜班') # 转换打卡时间为datetime df['打卡时间'] = pd.to_datetime(df['打卡时间']) # 定义班次上班时间,例如白班9:00,夜班22:00 def get_shift_start_time(row): if row['班次类型'] == '白班': return datetime(row['打卡时间'].year, row['打卡时间'].month, row['打卡时间'].day, 9, 0) else: # 夜班的前一天晚上22点,例如打卡时间在跨天的情况下,比如0点到6点,归属为前一天的夜班 # 例如,如果打卡时间是2023-10-11 1:00,则夜班上班日期为2023-10-10 22:00 shift_date = row['打卡时间'] - pd.Timedelta(hours=6) # 假设夜班结束在6点,调整日期 return datetime(shift_date.year, shift_date.month, shift_date.day, 22, 0) df['应上班时间'] = df.apply(get_shift_start_time, axis=1) # 计算闸机外时间:打卡时间 - 应上班时间,如果打卡时间晚于应上班时间 df['闸机外时间'] = (df['打卡时间'] - df['应上班时间']).dt.total_seconds() / 60 # 转换为分钟 # 过滤出打卡时间晚于应上班时间的记录 df_delay = df[df['闸机外时间'] > 0] # 按员工ID和日期(应上班时间的日期)分组,统计总闸机外时间 df_delay['日期'] = df_delay['应上班时间'].dt.date result = df_delay.groupby(['员工ID', '日期'])['闸机外时间'].sum().reset_index() # 输出结果 result.to_excel('闸机外时间统计.xlsx', index=False) ``` 但是上述代码可能需要根据实际数据结构调整,比如员工每天的打卡次数,如何确定正确的应上班时间,特别是夜班的情况。此外,如果有员工在应上班时间之前打卡,可能需要排除这些记录,或者视为准时。另外,需要处理可能存在的多次打卡,比如员工可能多次进出,但用户可能只关心上班后的首次进入时间。 此外,需要考虑跨天的夜班情况,例如夜班的应上班时间是前一天的22点,而打卡时间可能在当天的0点之后,这时候如何正确归属日期。可能需要根据班次类型调整应上班时间的日期。 可能还需要对每个员工每天只取第一次晚于应上班时间的打卡记录,或者所有超过的时间累计,但用户需求是统计总时间,可能需要明确是否是累计还是单次。如果是统计迟到的时间,可能只需要首次打卡的时间差。 总之,关键点在于正确处理夜班的日期和时间,以及准确计算每个员工每天的闸机外时间。可能需要更多的数据清洗和逻辑判断,比如处理跨天的情况,确保每个班次的应上班时间正确,然后根据实际打卡时间计算差值。</think>以下是用Python处理Excel数据统计闸机外时间的完整解决方案: ```python import pandas as pd from datetime import datetime, timedelta def process_attendance(file_path): # 读取Excel数据 df = pd.read_excel(file_path) # 转换时间列为datetime类型 df['打卡时间'] = pd.to_datetime(df['打卡时间']) # 创建班次时间对照字典(可根据实际情况修改) shift_times = { '白班': {'start': 9, 'end': 17}, '夜班': {'start': 22, 'end': 6} } def get_shift_date(row): """处理跨天夜班日期逻辑""" if row['班次类型'] == '夜班' and row['打卡时间'].hour < 12: return row['打卡时间'].date() - timedelta(days=1) return row['打卡时间'].date() # 添加实际班次日期列 df['班次日期'] = df.apply(get_shift_date, axis=1) # 计算应到时间 def get_scheduled_time(row): shift = shift_times[row['班次类型']] return datetime.combine( row['班次日期'], datetime.min.time() ).replace(hour=shift['start']) df['应到时间'] = df.apply(get_scheduled_time, axis=1) # 计算时间差(分钟) df['时间差'] = (df['打卡时间'] - df['应到时间']).dt.total_seconds() / 60 # 筛选有效记录(仅保留上班后的打卡) valid_records = df[df['时间差'] >= 0] # 分组统计 result = valid_records.groupby(['员工ID', '班次日期']).agg({ '时间差': 'sum', '班次类型': 'first' }).reset_index() # 重命名列 result.columns = ['员工ID', '日期', '闸机外总时长(分钟)', '班次类型'] return result # 使用示例 result = process_attendance('考勤数据.xlsx') result.to_excel('统计结果.xlsx', index=False) ``` **实现逻辑说明:** 1. **数据准备阶段** - 使用`pandas`读取Excel文件 - 将打卡时间转换为datetime类型 - 创建班次时间对照字典(可自定义) 2. **日期处理关键点** - 对夜班进行特殊处理:当打卡时间在次日中午12点前,归属到前一天的班次 - 生成准确的班次日期列`班次日期` 3. **时间计算逻辑** - 根据班次类型生成应到时间`应到时间` - 计算实际打卡与应到时间的差值(分钟) - 过滤无效记录(提前打卡的情况) 4. **统计与输出** - 按员工ID和日期分组汇总 - 保留班次类型信息 - 输出到新的Excel文件 **夜班处理细节:** 1. 通过`get_shift_date`函数自动校正日期: - 夜班人员在次日12点前的打卡都算作前一天的班次 2. 应到时间生成: - 夜班统一设置为当日22:00 - 白班设置为当日9:00 **使用注意事项:** 1. 输入Excel需包含列: - 员工ID(字符串或数字) - 打卡时间(可识别的日期时间格式) - 班次类型(必须包含"白班"/"夜班") 2. 输出结果包含: - 员工ID - 日期 - 总滞留时间(分钟) - 班次类型 **扩展建议:** 1. 如需统计最/最晚打卡时间,可在groupby中添加`min`/`max`聚合 2. 可添加迟到次数统计: ```python .agg({ '时间差': ['sum', 'count'], ... }) ``` 3. 如需处理调休、节假日等情况,可添加例外日期表进行关联 该方案已考虑夜班跨天场景,可自动校正日期归属问题,准确统计各时段滞留时间。实际应用时请根据具体班次时间调整`shift_times`字典中的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值