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

小岛来信
小岛来信
发布时间:2026-10-15 | 6人浏览过
原创

本文介绍如何利用SeaTable的Python脚本功能,结合自定义节假日与调休规则,自动计算两个日期之间的实际工作日天数。通过示例代码展示如何处理中国法定节假日及周末调休,提升项目管理和任务排期的精细化程度,实现数据自动化处理。

在计算两个日期之间的间隔时,简单的结束日期减去开始日期往往无法满足实际需求。在项目管理、任务调度或工作计划等场景中,必须考虑双休日、法定节假日以及企业自定义的工作安排。因此,准确计算两个日期之间的实际工作日天数显得尤为重要。例如,在包含多条任务的表格中,每条任务都有独立的开始日期、计划结束日期或实际结束日期,通过自动计算工作日天数,可以实现更精细化和量化的管理。

此时,Python便派上了用场,而结合SeaTable使用Python脚本则能极大简化工作管理流程。本文主要分享实现思路与核心代码,供读者参考借鉴。

SeaTable表格支持丰富的数据类型,包括日期、单选、协作人、公式和按钮等,能够规范且便捷地管理各类信息。此外,SeaTable还提供了基础功能与扩展功能,其中脚本功能尤为实用。在表格界面点击“脚本”按钮,即可导入或新建多个脚本,并支持一键运行。若需设置定期执行,可通过“自动化规则”进行配置。

以具体表格为例,开始时间由项目管理者填写,结束时间由任务负责人在项目完成后填写,而工作日天数则通过运行Python脚本,根据开始和结束时间自动计算得出。

在SeaTable表格中新建Python脚本

具体操作步骤如下:首先,打开脚本功能模块,选择“新建脚本”,并指定语言为Python。

实现思路

在打开的脚本编辑界面中,即可开始编写具体的脚本逻辑。

在编写计算工作日的脚本时,需注意以下几个关键问题,以中国为例:

  • 来年的工作日和休息日安排暂不支持,因为国家尚未发布相关公告。
  • 需要定义平日中的休息日期,即确定周一到周五中哪一天被设定为休息日。
  • 需要定义周末的工作日期,即确定周六或周日中哪一天因调休而变为工作日。

代码实现

将上述特殊日期逐一列出后,脚本的编写便不再困难。以下提供部分脚本片段,以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计算工作日天数的信息,请搜索本站历史文章或继续浏览后续相关文章。希望大家今后能多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表