需求与背景

某公司旗下有很多便利店,但近期却发现个别门店存在全职帮兼职打卡的情况,为此总部领导决定对所有门店的打卡时间数据进行分析,将每一个门店,全职人员和兼职人员上班卡、下班卡其中之一相差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数据处理|筛选与兼职打卡时间差异在一分钟内的全职打卡数据相关推荐

  1. Pandas数据处理1、DataFrame删除NaN空值(dropna各种属性值控制超全)

    Pandas数据处理--渐进式学习 目录 Pandas数据处理--渐进式学习 前言 环境 DataFrame删除NaN空值 dropna函数参数 测试数据 删除所有有空的行 axis属性值 how属性 ...

  2. miui删除内置不卡米教程_miui9卸载哪些内置应用不会卡米

    2 miui9 卸载哪些内置应用不会卡米? /miui9 内置软件可精简列表? 一.以下项酌情精简: 1 . /system/data-app 非系统软件 全部删除 /cust/app/ 预置非系统软 ...

  3. 935计算机学霸时间分配,725分!学霸真的全靠练,奉上学习安排表及方法

    原标题:725分!学霸真的全靠练,奉上学习安排表及方法 不想成为学霸的学生不是好学生. 我们往往会安慰自己说,没有天才的的脑袋,注定与学霸无缘,但初三到了,我们要看到真相,摈弃懒惰,一起看看下面一位学 ...

  4. js 格式化间隔时间(如:2分钟前)

    function formatIntervalTime(timeStr) {const targetTime = new Date(timeStr);const presentTime = new D ...

  5. pandas 根据筛选条件对指定excel列进行筛选

    pandas 根据筛选条件对指定excel列进行筛选 导入需要筛选的excel和筛选条件 要筛选的表格A 思路 结果 这两天老师要求筛选一下最近几年学院发表的文章,从图书馆那要了份数据量较大的exce ...

  6. Pandas数据处理方法(包括数据库数据和普通文件数据)

    pandas是一个强大的分析结构化数据的工具集:它的使用基础是Numpy(提供高性能的矩阵运算):用于数据挖掘和数据分析,同时也提供数据清洗功能. Pandas中常见的数据结构有两种: Series ...

  7. Pandas根据筛选条件对指定excel列进行筛选!神器!

    这两天老师要求筛选一下最近几年学院发表的文章,从图书馆那要了份数据量较大的excel,将该excel分成学生文章.老师文章两份excel,以第一作者为区分,B站学习法稍微补了补python操作exce ...

  8. pandas数据处理120题

    1.DataFrame基本操作 import numpy as np import pandas as pd import matplotlib.pyplot as plt 1.将下面的字典创建为Da ...

  9. 12 个 Pandas 数据处理高频操作

    作者 | 老表 来源 | 简说Python 今天给大家分享几个自己近期常用的Pandas数据处理技巧,主打实用,所以你肯定能用的着,建议扫一遍,然后收藏起来,下次要用的时候再查查看即可. 简单说说 总 ...

最新文章

  1. 微软推出Windows XP/Server 2003紧急安全补丁:修复远程桌面CVE-2019-0708漏洞
  2. SSH框架整合实现Java三层架构实例(一)
  3. 新建/初始化git仓库
  4. linux线程池资料
  5. mega2560单片机开发_[MEGA DEAL] Ultimate Java开发和认证指南(59%折扣)
  6. Linux认证复习题100道含答案
  7. 计蒜客挑战难题:A+B+C问题
  8. VCSA6.7 备份和还原
  9. 【题解】【A % B Problem(P1865)】-C++
  10. java gson使用_Java 如何使用Gson解析JSON数组
  11. 小米4A 32电视通过TTL方式ROOT的方法
  12. (转)国内外三个不同领域巨头分享的Redis实战经验及使用场景
  13. 项目管理心得体会(一)
  14. Storm入门与实践(3)通过WordCount展开Storm的编程之旅
  15. 公司“内部管理混乱,工作很难开展”!
  16. 干掉Intel、AMD?国产处理器架构都有哪些?
  17. 人工智能领域顶会及期刊
  18. 基于spring websocket+sockjs实现的长连接请求
  19. 太空避难所修改数据(船员和货币)
  20. MismatchedInputException: Cannot deserialize instance of `xxx` out of START_ARRAY token

热门文章

  1. RDF 和 SPARQL 初探:以维基数据为例
  2. IOS下实现高性能画板橡皮擦的办法
  3. 智能工厂和数字化车间有什么不同?
  4. Modbus TCP协议概述
  5. oracle11g正则表达式
  6. oracle删除表空间及用户
  7. Java入门学习笔记——郝斌(一)概述及面向对象
  8. v9 手机门户内容无法显示
  9. FF800R12KE7HPSA1 IGBT 1200V 800A AG-62MM
  10. scipy中的scipy.optimize.curve_fit