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 相关文章推荐
Python使用urllib2模块抓取HTML页面资源的实例分享
May 03 Python
听歌识曲--用python实现一个音乐检索器的功能
Nov 15 Python
用Python将mysql数据导出成json的方法
Aug 21 Python
解决在pycharm中显示额外的 figure 窗口问题
Jan 15 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
Python有参函数使用代码实例
Jan 06 Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 Python
python_array[0][0]与array[0,0]的区别详解
Feb 18 Python
Python函数基本使用原理详解
Mar 19 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
python输出结果刷新及进度条的实现操作
Jul 13 Python
python 三边测量定位的实现代码
Apr 22 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
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
python中enumerate函数遍历元素用法分析
2016/03/11 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
Staples美国官方网站:办公用品一站式采购
2016/07/28 全球购物
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
美国韩国化妆品和护肤品购物网站:Beautytap
2018/07/29 全球购物
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
车祸赔偿收入证明
2014/01/09 职场文书
高三地理教学反思
2014/01/11 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
教师先进事迹材料
2014/12/16 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
计生个人工作总结
2015/02/28 职场文书
2015暑假假期总结
2015/07/13 职场文书
整脏治乱工作简报
2015/07/21 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python