Pandas数据处理|筛选与兼职打卡时间差异在一分钟内的全职打卡数据
需求与背景
某公司旗下有很多便利店,但近期却发现个别门店存在全职帮兼职打卡的情况,为此总部领导决定对所有门店的打卡时间数据进行分析,将每一个门店,全职人员和兼职人员上班卡、下班卡其中之一相差1分钟以内的数据找出来,然后再具体调查。
下面我们的任务就是以兼职人员数据为基准,找出相同门店下全职人员上班卡、下班卡其中之一相差1分钟以内的数据:
解决需求
首先读取数据(已脱敏):
import pandas as pdexcel = pd.ExcelFile("全职与兼职相差一分钟.xlsx")
df_fulltime = excel.parse("全职")
df_parttime = excel.parse("兼职")
display(df_fulltime.head())
print(df_fulltime.shape)
display(df_parttime.head())
print(df_parttime.shape)
由于两张表的数据列名一致,我们可以将两张表拼接起来,方便分组:
df_fulltime["类型"] = "全职"
df_parttime["类型"] = "兼职"
df = pd.concat([df_fulltime, df_parttime], ignore_index=True)
df
测试分组和拆分:
for (area, store, time), df_split in df.groupby(["区域", "门店", "日期"]):print(area, store, time)df_fulltime_split = df_split.query("类型=='全职'")df_parttime_split = df_split.query("类型=='兼职'")display(df_fulltime_split)display(df_parttime_split)break
不过上述数据并没有能够匹配的数据,我们选个有结果的分组进行测试:
g = df.groupby(["区域", "门店", "日期"])
df_split = g.get_group(("DB区域", "54mh5", "2020-08-04"))
df_fulltime_split = df_split.query("类型=='全职'")
df_parttime_split = df_split.query("类型=='兼职'")
display(df_fulltime_split)
display(df_parttime_split)
为了方便计算,获取上下班时间的分钟数:
def func(time_str):if not isinstance(time_str, str):return 0time_arr = time_str.split(":")return int(time_arr[0])*60+int(time_arr[1])df_fulltime_time = df_fulltime_split[["上班卡", "下班卡"]].applymap(func)
df_parttime_time = df_parttime_split[["上班卡", "下班卡"]].applymap(func)display(df_fulltime_time)
display(df_parttime_time)
测试数据筛选:
for (time1, time2), row in zip(df_parttime_time.values, df_parttime_split.values[:, :-1]):print(time1, time2)print(row)idx = df_fulltime_time.query(f"{time1-1}<=上班卡<={time1+1} or {time2-1}<=下班卡<={time2+1}").indexdisplay(df_fulltime_split.loc[idx])break
测试数据整理:
result = []
data = df_fulltime_split.loc[idx].values[:, 3:-1]
row = row.tolist()
row.extend(data)
result.append(row)
result = pd.DataFrame(result)
result.rename(columns=dict(enumerate(["区域", "门店", "日期", "工号", "姓名", "上班卡", "下班卡"])), inplace=True)
result.rename(columns=lambda x: x if isinstance(x, str) else f"全职打卡{x-1}", inplace=True)
result
整理一下完整代码:
完整代码
import pandas as pdexcel = pd.ExcelFile("全职与兼职相差一分钟.xlsx")
df_fulltime = excel.parse("全职")
df_parttime = excel.parse("兼职")
df_fulltime["类型"] = "全职"
df_parttime["类型"] = "兼职"
df = pd.concat([df_fulltime, df_parttime], ignore_index=True)def func(time_str):if not isinstance(time_str, str):return 0time_arr = time_str.split(":")return int(time_arr[0])*60+int(time_arr[1])result = []
for (area, store, time), df_split in df.groupby(["区域", "门店", "日期"]):df_fulltime_split = df_split.query("类型=='全职'")df_parttime_split = df_split.query("类型=='兼职'")df_fulltime_time = df_fulltime_split[["上班卡", "下班卡"]].applymap(func)df_parttime_time = df_parttime_split[["上班卡", "下班卡"]].applymap(func)for (time1, time2), row in zip(df_parttime_time.values, df_parttime_split.values[:, :-1]):idx = df_fulltime_time.query(f"{time1-1}<=上班卡<={time1+1} or {time2-1}<=下班卡<={time2+1}").indexif len(idx) > 0:data = df_fulltime_split.loc[idx].values[:, 3:-1]row = row.tolist()row.extend(data)result.append(row)
result = pd.DataFrame(result)
result.rename(columns=dict(enumerate(["区域", "门店", "日期", "工号", "姓名", "上班卡", "下班卡"])), inplace=True)
result.rename(columns=lambda x: x if isinstance(x, str) else f"全职打卡{x-1}", inplace=True)
result
最终结果:
Pandas数据处理|筛选与兼职打卡时间差异在一分钟内的全职打卡数据相关推荐
- Pandas数据处理1、DataFrame删除NaN空值(dropna各种属性值控制超全)
Pandas数据处理--渐进式学习 目录 Pandas数据处理--渐进式学习 前言 环境 DataFrame删除NaN空值 dropna函数参数 测试数据 删除所有有空的行 axis属性值 how属性 ...
- miui删除内置不卡米教程_miui9卸载哪些内置应用不会卡米
2 miui9 卸载哪些内置应用不会卡米? /miui9 内置软件可精简列表? 一.以下项酌情精简: 1 . /system/data-app 非系统软件 全部删除 /cust/app/ 预置非系统软 ...
- 935计算机学霸时间分配,725分!学霸真的全靠练,奉上学习安排表及方法
原标题:725分!学霸真的全靠练,奉上学习安排表及方法 不想成为学霸的学生不是好学生. 我们往往会安慰自己说,没有天才的的脑袋,注定与学霸无缘,但初三到了,我们要看到真相,摈弃懒惰,一起看看下面一位学 ...
- js 格式化间隔时间(如:2分钟前)
function formatIntervalTime(timeStr) {const targetTime = new Date(timeStr);const presentTime = new D ...
- pandas 根据筛选条件对指定excel列进行筛选
pandas 根据筛选条件对指定excel列进行筛选 导入需要筛选的excel和筛选条件 要筛选的表格A 思路 结果 这两天老师要求筛选一下最近几年学院发表的文章,从图书馆那要了份数据量较大的exce ...
- Pandas数据处理方法(包括数据库数据和普通文件数据)
pandas是一个强大的分析结构化数据的工具集:它的使用基础是Numpy(提供高性能的矩阵运算):用于数据挖掘和数据分析,同时也提供数据清洗功能. Pandas中常见的数据结构有两种: Series ...
- Pandas根据筛选条件对指定excel列进行筛选!神器!
这两天老师要求筛选一下最近几年学院发表的文章,从图书馆那要了份数据量较大的excel,将该excel分成学生文章.老师文章两份excel,以第一作者为区分,B站学习法稍微补了补python操作exce ...
- pandas数据处理120题
1.DataFrame基本操作 import numpy as np import pandas as pd import matplotlib.pyplot as plt 1.将下面的字典创建为Da ...
- 12 个 Pandas 数据处理高频操作
作者 | 老表 来源 | 简说Python 今天给大家分享几个自己近期常用的Pandas数据处理技巧,主打实用,所以你肯定能用的着,建议扫一遍,然后收藏起来,下次要用的时候再查查看即可. 简单说说 总 ...
最新文章
- 微软推出Windows XP/Server 2003紧急安全补丁:修复远程桌面CVE-2019-0708漏洞
- SSH框架整合实现Java三层架构实例(一)
- 新建/初始化git仓库
- linux线程池资料
- mega2560单片机开发_[MEGA DEAL] Ultimate Java开发和认证指南(59%折扣)
- Linux认证复习题100道含答案
- 计蒜客挑战难题:A+B+C问题
- VCSA6.7 备份和还原
- 【题解】【A % B Problem(P1865)】-C++
- java gson使用_Java 如何使用Gson解析JSON数组
- 小米4A 32电视通过TTL方式ROOT的方法
- (转)国内外三个不同领域巨头分享的Redis实战经验及使用场景
- 项目管理心得体会(一)
- Storm入门与实践(3)通过WordCount展开Storm的编程之旅
- 公司“内部管理混乱,工作很难开展”!
- 干掉Intel、AMD?国产处理器架构都有哪些?
- 人工智能领域顶会及期刊
- 基于spring websocket+sockjs实现的长连接请求
- 太空避难所修改数据(船员和货币)
- MismatchedInputException: Cannot deserialize instance of `xxx` out of START_ARRAY token