背景
朋友李易柯脚受伤了,公司借此机会和朋友协商解除劳动合同,现在朋友需要我帮他统计出一份他非工作时间的聊天记录以作为认定其加班事实的证据,给我发了一份csv数据,有对话分组名,微信帐号 ,时间,消息类型, 消息内容等字段。感觉很多被辞退的朋友如果要去劳动仲裁可能都需要去统计自己加班时长来获取报酬,所以记录在这里以便使用。
需求梳理
和朋友交流整理其需求如下
1,筛出微信帐号为李易柯的记录;
2,在所有时间记录中寻找周一到周五18点到次日 9点的消息时间点和消息记录,统计总时长,按1.5倍时薪计算;
3,在所有时间记录中寻找周六周日的全部消息时间点,统计总时长,按2倍时薪计算;
4,在所有时间记录中寻找法定节假日的全部消息时间点,统计总时长,按2倍时薪计算;
5,按每小时86.21元分别计算薪酬;
分析与思路
此问题关键是把这些非工作时间里面的时间加起来,时间是多少就多少,然后再乘以时薪便是朋友的劳动报酬了,设计思路如下
1,筛出李易珂的记录;
2,找出所有不同日期,把每个日期都加上班时间和下班时间两个基准线;
3,构造出一个只有上班时间和下班时间两个基准线的数据框DataFrame;
4,将构造出的DataFrame与最初的DataFrame按行拼接;
5,对时间进行排序;
6,计算前后相邻的时间差;
7,判断星期几和是否节假日;
8,透视出节假日,周六周日,周中非工作时间的加班时长;
核心代码
这里给出核心代码
# -*- encoding: utf-8 -*-
'''
@Project : Li_chat
@Desc : 李易柯加班时长统计
@Time : 2024/05/20 14:04:59
@Author : 帅帅de三叔,zengbowengood@163.com
'''
import csv
import pandas as pd
from datetime import datetime
import holidays
cn_holidays = holidays.China()
from chinese_calendar import is_workday
data = pd.read_csv(r"D:\项目\李易柯聊天记录\李易珂微信聊天记录.csv", parse_dates = ['时间']) #读取本地数据
df1 = data[data['微信帐号'].str.contains('李易珂')] #过滤出微信账号含李易珂的记录
uni_date = pd.Series([i.date() for i in df1['时间']]).unique() #提起所有不同日期
open_time = [str(i)+" "+'9:00' for i in uni_date] #每天开班时间,日期+时间
close_time = [str(i)+" "+'18:00' for i in uni_date] #每天下班时间,日期+时间
df2 = pd.DataFrame([]) #构造第二个数据框用来卡上下班时间
df2['时间'] = open_time + close_time #把每天上班下班
df2['时间'] = pd.to_datetime(df2['时间'])
df2['对话分组名'] = ['广东建包群' for i in df2['时间']]
df2['微信帐号'] = ['李易珂' for i in df2['时间']]
df2['消息类型'] = ['已接收' for i in df2['时间']]
df2['消息内容'] = ['ok' for i in df2['时间']]
df = pd.concat([df1, df2], axis=0) #拼接数据框
df_sorted = df.sort_values(by='时间') #按时间排序
df_sorted['时间差'] = (df_sorted['时间'] - df_sorted['时间'].shift(1)).dt.total_seconds()/60 #分钟
df_sorted['时间差'].fillna(value=0,inplace=True) #第一个没做差,填0
df_out_worktime = df_sorted[(df_sorted['时间'].dt.hour<9)|(df_sorted['时间'].dt.hour>18)] #非工作时间
df_out_worktime['星期几'] = [i.date().weekday()+1 for i in df_out_worktime['时间']] #星期
df_out_worktime['是否法定节假日'] = ['否' if is_workday(i.date()) else '是' for i in df_out_worktime['时间']]
df_out_worktime.to_excel(r"D:\项目\李易柯聊天记录\李易珂微信非工作时间的聊天记录.xlsx")
把最后非工作时间的聊天记录.xlsx文件给了朋友,应该很快能够透视出其非工作时间的加班时长。
优缺点
1,在先判点9点到18点与周末节假日的时候先后顺序会导致误差;
2,每天第一条时间差会偏大;