Python计算办公时长:CSV数据处理与时间差计算

python计算办公时长:csv数据处理与时间差计算

本文旨在提供一个Python脚本,用于从CSV文件中读取数据,计算特定月份内(例如二月)每个ID对应的办公时长。该脚本不依赖Pandas库,而是使用csv和datetime模块进行数据处理和时间计算。文章将详细解释代码逻辑,并提供注意事项,帮助读者理解和应用该方法。

数据准备

首先,我们需要准备包含ID、类型(in/out)和时间信息的CSV文件。以下是一个示例CSV文件的内容(data.csv):

id,type,time1,out,2023-01-01T08:01:28.000Z1,in,2023-02-01T08:01:28.000Z2,in,2023-02-01T09:04:16.000Z2,out,2023-02-01T12:01:28.000Z1,out,2023-02-01T13:34:15.000Z

Python 代码实现

以下Python代码展示了如何读取CSV文件,筛选二月份的数据,并计算每个ID的办公时长。

import datetimeimport csvdate_format = '%Y-%m-%dT%H:%M:%S.%fZ'total_time = {}feb = datetime.datetime.strptime('2023-02', '%Y-%m').monthfile_path = 'data.csv'with open(file_path, 'r') as f:    # Create a CSV reader    csv_file = csv.DictReader(f)    list_of_dict = list(csv_file)for d in list_of_dict:  w_id = d['id']  dt = datetime.datetime.strptime(d['time'], date_format).date()  d_time = datetime.datetime.strptime(d['time'], date_format)  if d_time.month == feb:    if not total_time.get(w_id):      total_time[w_id] = {"date": None,"last_in": None, "last_out": None, "work_hour_s": 0. , 'work_hour_string': '' }    update_time = total_time[w_id]    update_time['date'] = dt    if d['type'] == 'in':      update_time['last_in'] = d_time    if d['type'] == 'out':      update_time['last_out'] = d_time    if update_time['last_out'] and update_time['last_in']:      if update_time['last_out'] > update_time['last_in']:        work_hour_s = update_time['last_out'] - update_time['last_in']        update_time['work_hour_s'] += work_hour_s.seconds        up_time = int(update_time['work_hour_s'])        hours, remainder = divmod(up_time, 3600)        minutes, seconds = divmod(remainder, 60)        formatted_duration = f"{hours:02d}:{minutes:02d}:{seconds:02d}"        update_time['work_hour_string'] = formatted_durationprint(total_time)

代码解释:

立即学习“Python免费学习笔记(深入)”;

导入必要的模块: 导入 datetime 用于处理日期和时间,csv 用于读取CSV文件。定义日期格式: date_format = ‘%Y-%m-%dT%H:%M:%S.%fZ’ 定义了CSV文件中时间戳的格式。初始化数据结构: total_time = {} 用于存储每个ID对应的办公时长信息。指定目标月份: feb = datetime.datetime.strptime(‘2023-02’, ‘%Y-%m’).month 获取二月份的月份值。读取CSV文件: 使用 csv.DictReader 读取CSV文件,并将每行数据存储为字典。遍历数据: 遍历CSV文件中的每一行数据。筛选目标月份数据: 检查当前行数据的月份是否为二月。初始化ID数据: 如果total_time字典中不存在当前ID,则初始化一个包含date, last_in, last_out, work_hour_s, work_hour_string等键的字典。更新最后进入/离开时间: 根据type字段的值,更新last_in或last_out时间。计算办公时长: 如果last_in和last_out都存在,则计算二者的时间差,并将结果累加到work_hour_s中。格式化输出: 将总秒数转换为HH:MM:SS格式的字符串,并存储在work_hour_string中。输出结果: 打印total_time字典,其中包含了每个ID在二月份的办公时长信息。

输出示例:

{'1': {'date': datetime.date(2023, 2, 1),  'last_in': datetime.datetime(2023, 2, 1, 8, 1, 28),  'last_out': datetime.datetime(2023, 2, 1, 13, 34, 15),  'work_hour_s': 19967.0,  'work_hour_string': '05:32:47'}, '2': {'date': datetime.date(2023, 2, 1),  'last_in': datetime.datetime(2023, 2, 1, 9, 4, 16),  'last_out': datetime.datetime(2023, 2, 1, 12, 1, 28),  'work_hour_s': 10632.0,  'work_hour_string': '02:57:12'}}

注意事项

数据顺序: 代码假设同一ID的in和out记录是成对出现的,并且out记录的时间晚于in记录。如果数据不是有序的,需要先进行排序。数据完整性: 代码没有处理数据缺失的情况,例如只有in记录而没有out记录,或者反之。在实际应用中,需要根据具体情况进行处理。例如,可以忽略只有in或out的记录,或者使用默认值填充缺失的in或out时间。日期格式: 确保CSV文件中的日期格式与date_format变量定义的格式一致。如果不一致,需要修改date_format变量。时区问题: 代码没有考虑时区问题。如果CSV文件中的时间戳包含时区信息,需要先将时间戳转换为统一的时区,然后再进行计算。错误处理: 在实际应用中,应该添加错误处理机制,例如使用try-except块来捕获可能发生的异常,例如文件不存在、日期格式错误等。

总结

本文提供了一个使用Python计算CSV文件中办公时长的示例代码,并详细解释了代码逻辑和注意事项。该代码不依赖Pandas库,而是使用csv和datetime模块进行数据处理,可以作为处理CSV数据的基础。在实际应用中,需要根据具体情况进行修改和完善,例如处理数据缺失、时区问题和错误处理等。

以上就是Python计算办公时长:CSV数据处理与时间差计算的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1368732.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 09:02:39
下一篇 2025年12月14日 09:02:58

相关推荐

  • 计算Python中的办公时长

    本文介绍了如何使用Python计算CSV文件中员工在特定月份(例如2月)的办公时长,重点在于处理时间数据、按ID分组以及计算时间差。文章提供了详细的代码示例,展示了如何读取CSV文件、解析日期时间字符串、按ID聚合数据,并最终计算出每个ID在指定月份的总办公时长。同时,也提醒了数据清洗和异常处理的重…

    好文分享 2025年12月14日
    000
  • 解决LabelEncoder在训练集和测试集上出现“未见标签”错误

    本文旨在帮助读者理解并解决在使用LabelEncoder对分类变量进行编码时,遇到的“y contains previously unseen labels”错误。通过详细分析错误原因,并提供正确的编码方法,确保模型在训练集和测试集上的一致性,避免数据泄露。 问题分析 在使用LabelEncoder…

    2025年12月14日
    000
  • 解决Twine上传PyPI时reStructuredText描述渲染失败的问题

    Python开发者在发布包到PyPI时,常使用twine工具。尽管本地build过程顺利,但在执行twine upload时却可能遭遇HTTPError: 400 Bad Request,并伴随“The description failed to render for ‘text/x-r…

    2025年12月14日
    000
  • 使用 LabelEncoder 时避免“未见标签”错误

    本文旨在帮助读者理解并解决在使用 LabelEncoder 对数据进行编码时遇到的“y contains previously unseen labels”错误。我们将深入探讨错误原因,并提供清晰的代码示例,展示如何正确地使用 LabelEncoder 对多个特征列进行编码,确保模型训练和预测过程的…

    2025年12月14日
    000
  • 解决Twine上传PyPI时RST描述渲染失败问题

    本文旨在解决Python包上传至PyPI时,因long_description中的reStructuredText (RST) 描述渲染失败而导致的HTTPError: 400 Bad Request问题。通过详细分析错误原因,特别是.. raw:: html指令的不兼容性,并提供具体的RST语法修…

    2025年12月14日
    000
  • 解决LabelEncoder无法识别先前“见过”的标签问题

    本文旨在解决在使用 LabelEncoder 对数据进行编码时,遇到的“y contains previously unseen labels”错误。该错误通常出现在训练集和测试集(或验证集)中包含不同的类别标签时。本文将详细解释错误原因,并提供正确的编码方法,确保模型能够正确处理所有类别。 在使用…

    2025年12月14日
    000
  • 清理Python项目构建文件:告别setup.py的时代

    清理Python项目构建文件,告别setup.py的时代。随着setup.py的弃用和pyproject.toml的普及,我们需要掌握新的清理策略。本文将指导你手动识别并删除常见的构建产物,确保项目目录的整洁,并提供一些便捷的清理技巧,适用于使用python -m build构建的项目。 在过去,通…

    2025年12月14日
    000
  • 解决PyPI上传失败:理解reStructuredText描述渲染错误

    当Python包上传到PyPI时,如果遇到“The description failed to render for ‘text/x-rst’”错误,通常是由于long_description字段中的reStructuredText(RST)标记不符合PyPI的渲染规范。特别…

    2025年12月14日
    000
  • 如何清理 Python 项目中的构建文件(无需 setup.py)

    本文旨在介绍如何在不依赖 setup.py 的情况下,清理使用 python -m build 构建的 Python 项目中的构建文件。随着 setup.py 的逐渐弃用,了解如何手动清理构建产物变得至关重要。本文将详细列出需要清理的常见文件和目录,并提供相应的操作指南,帮助开发者维护一个干净的开发…

    2025年12月14日
    000
  • Python项目清理:告别setup.py,手动清除构建文件

    随着Python项目构建方式从setup.py转向pyproject.toml和python -m build,传统的setup.py clean命令不再适用。本文将指导您如何在没有setup.py文件的项目中,手动识别并安全删除常见的构建产物和临时文件,如__pycache__目录、.pyc文件、…

    2025年12月14日
    000
  • Python项目构建文件清理指南:告别setup.py的现代化实践

    本文旨在为不使用setup.py而采用pyproject.toml构建的Python项目提供一套清理构建文件的实用指南。随着setup.py的逐步弃用,理解并手动识别及删除如__pycache__、.pyc文件、build目录等临时构建产物变得至关重要,以确保项目环境的整洁和可控性。 背景:从set…

    2025年12月14日
    000
  • 使用 Flask 和 Python 定时刷新 CSV 文件

    本文旨在指导开发者如何使用 Flask 框架和 Python 实现定时刷新 CSV 文件的功能,以便在 Web 应用中展示最新的数据。我们将探讨使用 Celery、APScheduler 或简单的 cron 任务来自动化数据抓取和更新 CSV 文件的过程,并讨论如何处理文件锁定的问题,确保数据的一致…

    2025年12月14日
    000
  • 使用 Pandas 实现分组数据框的条件性行级别统计计算

    本文详细介绍了如何使用 Pandas 在数据框中执行复杂的条件性分组计算,特别是当统计结果需要根据组内特定条件(如唯一月份数)进行筛选,并将计算值广播回原始行的场景。教程将重点讲解 groupby() 结合 transform() 方法,以及如何巧妙运用 where() 进行条件性赋值,最终实现高效…

    2025年12月14日
    000
  • 获取 Discord 角色 ID:Discord.py 教程

    本教程旨在帮助你理解如何使用 discord.py 库通过角色 ID 获取 Role 对象。我们将重点讲解 discord.Guild.get_role() 方法的正确使用方式,避免常见的 TypeError 错误,并提供示例代码和相关文档链接,以便你更好地理解和应用。 在使用 discord.py…

    2025年12月14日
    000
  • discord.py 教程:正确根据ID获取Discord角色对象

    本教程详细讲解了在 discord.py 中根据角色ID获取 discord.Role 对象的正确方法。针对常见的 TypeError: Guild.get_role() got some positional-only arguments passed as keyword arguments 错…

    2025年12月14日
    000
  • 获取Discord角色ID:使用Discord.py的正确方法

    本文档旨在指导开发者如何使用discord.py库通过角色ID获取Discord服务器中的角色对象。我们将纠正常见的错误用法,并提供清晰的代码示例,确保你能够顺利地将角色分配给新加入的成员。重点在于理解Guild.get_role()方法的正确调用方式,以及如何从Member对象获取Guild对象。…

    2025年12月14日
    000
  • Discord.py 中通过 ID 获取角色的正确姿势

    本文详细介绍了在 discord.py 库中如何正确地通过角色 ID 获取 Role 对象。通过分析常见错误 TypeError,强调了必须从 Guild 实例而非 discord.Guild 类调用 get_role() 方法,并正确地将角色 ID 作为位置参数传入。文章提供了清晰的代码示例和关键…

    2025年12月14日
    000
  • Python Mock 仅在特定导入方式下生效的原因解析

    本文旨在解释 Python 单元测试中,Mock 对象仅在特定模块导入方式下才能生效的现象。通过分析 from utils import get_id 和 from . import utils 两种导入方式的差异,深入剖析 Python 的模块导入机制,并提供正确的 Mock 使用方法,帮助开发者…

    2025年12月14日
    000
  • Python 脚本实现文件替换:在子目录中替换同名文件

    本文介绍了如何使用 Python 脚本实现在指定目录及其子目录中,用特定文件夹中的文件替换所有同名文件。核心方法是利用 Python 的 subprocess 模块调用 Windows 的 replace 命令。文章提供了一个简洁的 Python 代码示例,并强调了在不同操作系统环境下可能存在的差异…

    2025年12月14日
    000
  • 使用 Python 替换子目录中同名文件

    本文介绍了如何使用 Python 脚本实现类似于 Windows replace 命令的功能,即在指定目录及其子目录中,用特定文件夹中的文件替换所有同名文件。文章将演示如何利用 subprocess 模块在 Python 中调用系统命令,从而简化文件替换操作,并提供示例代码和注意事项,帮助读者理解和…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信