Python+SeaTable实现计算两个日期间的工作日天数


Posted in Python onJuly 07, 2022

当我们计算两个日期间的间隔天数时,通常是用结束日期减去开始日期,但在实际的项目管理、任务管理、工作计划等场景中,某些时间段会涉及双休日、法定节假日,甚至还有公司自定义的工作时间安排,所以就需要计算出两个日期间的实际工作日天数。比如一个表格中有多条任务,每条任务都有各自的开始日期、计划结束日期或实际结束日期,那么如何自动计算出两个日期间的实际工作日天数,以便做到精细和量化呢。

此时,万能的 Python 就可以出场了,而用 Python + SeaTable 来实现则会更加方便工作管理。本文重点分享思路和代码,仅供参考。

SeaTable 表格有丰富的数据类型,如日期、单选、协作人、公式、按钮等等,可以方便又规范地管理各类信息。此外,还有很多基础功能和扩展功能,这其中就包括脚本功能。在表格上点击“脚本”按钮,可以导入或新建多个脚本,随时一键运行即可(如需设置定期运行等可在“自动化规则”中实现)。

比如在下面这个表格中,开始时间由项目管理者填写; 结束时间由每个任务负责人在完成项目时填写; 工作日(天数)则根据开始时间和结束时间,运行 Python 脚本计算得出。

Python+SeaTable实现计算两个日期间的工作日天数

在 SeaTable 表格上新建 Python 脚本

具体来看。 首先, 我们打开脚本功能, 选择“新建脚本”, 选择 Python。

Python+SeaTable实现计算两个日期间的工作日天数

思路

在打开的界面中,就可以对脚本进行编写了。

在此处计算工作日的脚本编写过程中需要注意几个问题, 以中国为例:

  • 来年的工作日、休息日,暂不支持(因国家暂未发布安排) 。
  • 需要定义平日中休息的日期, 即周一到周五哪天休息。
  • 需要定义周末中工作的日期, 即周六、周日哪天调休。

代码

把以上的特殊日期一一列出来,这个脚本就不难编写了, 以下给出一些脚本片段, 以2022年为例。

import datetime
from enum import Enum
from seatable_api import dateutils, Base, context

# 一个 Base 的授权信息
SERVER_URL = context.server_url or 'https://cloud.seatable.cn'
API_TOKEN = context.api_token or 'dd46f9ca0172a850a0922107a6b2e6b99932b040'

# 1. 定义中国的节假日概况
class Holiday(Enum):
    new_years_day = "元旦"
    spring_festival = "春节"
    tomb_sweeping_day = "清明"
    labour_day ="劳动节"
    dragon_boat_festival = "端午"
    national_day = "国庆节"
    mid_autumn_festival = "中秋"

# 2. 列出节假日列表, 此处可以去查询日历,就不一一列出了
holidays = {
    datetime.date(year=2022, month=1, day=1): Holiday.new_years_day.value,
    datetime.date(year=2022, month=1, day=2): Holiday.new_years_day.value,
    datetime.date(year=2022, month=1, day=3): Holiday.new_years_day.value,
    datetime.date(year=2022, month=1, day=31): Holiday.spring_festival.value,
    datetime.date(year=2022, month=2, day=1): Holiday.spring_festival.value,
    .....
}

# 3.列出调休日的列表,及周六日为工作日的列表
workdays = {
    datetime.date(year=2022, month=1, day=29): Holiday.spring_festival.value,
    datetime.date(year=2022, month=1, day=30): Holiday.spring_festival.value,
    datetime.date(year=2022, month=4, day=2): Holiday.tomb_sweeping_day.value,
    datetime.date(year=2022, month=4, day=24): Holiday.labour_day.value,
    datetime.date(year=2022, month=5, day=7): Holiday.labour_day.value,
    datetime.date(year=2022, month=10, day=8): Holiday.national_day.value,
    datetime.date(year=2022, month=10, day=9): Holiday.national_day.value,
    ....
}

# 4. 定义是否是工作日
def is_workday(date):
    '''
    工作日定义:
    1. 日期在workdays字典的key中
    2. 星期是周一到周五且不在holidays字典的key中
    '''
    date = _validate_date(date)
    weekday = date.weekday()
    return bool(date in workdays.keys() or (weekday <= 4 and date not in holidays.keys()))
    
# 5. 计算两个日期之间的工作日, 此处返回的是工作日的列表, 该列表的长度即是工作日的天数
def get_workdays(start, end):
    """
    获取两个日期之间的工作日,返回datetime的列表
    """
    start, end = _validate_date(start, end)
    return list(filter(is_workday, get_dates(start, end)))
    
# 6. 将结果写入 SeaTable

def calculate_base_workdays(base, table_name):
    '''
    通过seatable表格中的,开始日期, 结束日期, 计算两个日期间工作日的天数,并把其更新到该行的
    工作日字段中
    '''

    for row in base.list_rows(table_name):
        row_id = row.get('_id')
        start_date = row.get("开始日期")
        end_date = row.get("结束日期")
        if not (start_date and end_date):
            continue
        try:
            work_day_list = get_workdays(start_date, end_date)
            # 两个日期间的工作日天数
            work_day_counts = len(work_day_list)
            cell_value = row.get("工作日")
            if cell_value == work_day_counts:
                continue
            base.update_row(
                table_name,
                row_id,
                {
                    "工作日": work_day_counts
                }
            )
        except Exception as e:
            print("start date: %s, end date: %s, error: %s" % (start_date, end_date, e) )
            continue
            
base = Base(API_TOKEN, SERVER_URL)
base.auth()
calculate_base_workdays(base, "工作任务安排")

总结

SeaTable 作为一款以在线协同表格为基础的新型数字化平台,功能丰富,使用灵活,能帮我们实现一体化数据管理和处理。当我们需要快速地开发自定义数据处理流程时,就可以使用它完善的 Python API 功能,能节省很多成本。具体到本案例中,除了使用 Python 来计算两个日期间的工作日外,还可以使用表格的日历插件、时间线插件、高级统计插件来进行查看和做可视化图表分析,让项目管理更方便,实现应用更简单。

到此这篇关于Python+SeaTable实现计算两个日期间的工作日天数的文章就介绍到这了,更多相关Python SeaTable计算工作日天数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Python 相关文章推荐
Windows下安装Django框架的方法简明教程
Mar 28 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
Oct 14 Python
对numpy中向量式三目运算符详解
Oct 31 Python
Python爬虫实现验证码登录代码实例
May 10 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
pyinstaller参数介绍以及总结详解
Jul 12 Python
Python Pandas 箱线图的实现
Jul 23 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
Oct 14 Python
Python编译为二进制so可执行文件实例
Dec 23 Python
keras 如何保存最佳的训练模型
May 25 Python
python使用ctypes库调用DLL动态链接库
Oct 22 Python
pandas中DataFrame检测重复值的实现
May 26 Python
Python实现数据的序列化操作详解
Jul 07 #Python
Python如何利用pandas读取csv数据并绘图
Python可视化神器pyecharts绘制水球图
Jul 07 #Python
python数字图像处理之图像自动阈值分割示例
Python 读取千万级数据自动写入 MySQL 数据库
Jun 28 #Python
python数字图像处理:图像简单滤波
Jun 28 #Python
python实现一个简单的贪吃蛇游戏附代码
You might like
如何在PHP中进行身份认证
2006/10/09 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
mysql总结之explain
2012/02/27 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
PHP+JS实现的实时搜索提示功能
2018/03/13 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
2020/06/17 Javascript
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
幼儿园消防演练方案
2014/02/13 职场文书
求职简历自我评价范例
2014/03/12 职场文书
2014年少先队工作总结
2014/12/03 职场文书
入党转正申请自我鉴定
2019/06/25 职场文书