乐趣区

关于python:Python-SeaTable-计算两个日期间的工作日天数

当咱们计算两个日期间的距离天数时,通常是用完结日期减去开始日期,但在理论的项目管理、工作治理、工作打算等场景中,某些时间段会波及双休日、法定节假日,甚至还有公司自定义的工作工夫安顿,所以就须要计算出两个日期间的理论工作日天数。比方一个表格中有多条工作,每条工作都有各自的开始日期、打算完结日期或理论完结日期,那么如何主动计算出两个日期间的理论工作日天数,以便做到精密和量化呢。

此时,万能的 Python 就能够出场了,而用 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, "工作工作安顿")

残缺脚本能够参照(链接): Python 脚本计算工作日天数

总结

SeaTable 作为一款以在线协同表格为根底的新型数字化平台,功能丰富,应用灵便,能帮咱们实现一体化数据管理和解决。当咱们须要疾速地开发自定义数据处理流程时,就能够应用它欠缺的 Python API 性能,能节俭很多老本。具体到本案例中,除了应用 Python 来计算两个日期间的工作日外,还能够应用表格的日历插件、工夫线插件、高级统计插件来进行查看和做可视化图表剖析,让项目管理更不便,实现利用更简略。


参考案例

Python + SeaTable | 从启信宝网站获取公司融资等信息至 SeaTable 表格

Python + SeaTable | 用 Python 从维基百科抓取冬奥会城市信息并制作地图

同步服务器日志到 SeaTable,让日志更好的可视化和协同解决

退出移动版