小编写这篇文章的一个主要目的,主要是用来给大家继续讲解关于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,"工作任务安排")
总结
SeaTable作为一款以在线协同表格为基础的新型数字化平台,功能丰富,使用灵活,能帮我们实现一体化数据管理和处理。当我们需要快速地开发自定义数据处理流程时,就可以使用它完善的Python API功能,能节省很多成本。具体到本案例中,除了使用Python来计算两个日期间的工作日外,还可以使用表格的日历插件、时间线插件、高级统计插件来进行查看和做可视化图表分析,让项目管理更方便,实现应用更简单。
到此为止,这篇文章就给大家解答完毕了,希望可以给大家带来更多帮助。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/128285.html
摘要:缘起这几日闲来无事撸代码,无意中发现一桩趣事。原以为是一个的,没想到经过一系列死磕,挖掘出了一段和中国历史乃至人类文明相关联的人文故事,不禁唏嘘感叹一番。 缘起 这几日闲来无事撸代码,无意中发现一桩趣事。原以为是一个Java的bug,没想到经过一系列死磕,挖掘出了一段和中国历史乃至人类文明相关联的人文故事,不禁唏嘘感叹一番。 这件事的缘起很简单,我在实现计算两个日期天数距离逻辑的过程中...
摘要:日期转换程序思想言归正传。下述代码以年与年为例,给出了两年每个月份的天数以及每年月日的礼拜日期,以此作为起点计算该年中任意一个日期的礼拜时间。 [Python实践] 利用python实现的日期映射礼拜X的简单实现 2018年12月19日 最近在处理分析数据的时候,突发奇想试着从用户离职的日期上判断是主动辞职还是被动解雇?数据的背景是美国某企业员工离职日期数据,根据美国常见的周薪/半月薪...
摘要:儒略日就是指从公元前年月日开始所经过的天数,就被指定为公元前年月日到公元前年月日之间的小时,依次顺推,每一天都被赋予一个唯一的数字。 最近闲来无事,突然想了解下中国农历与中国阳历之间的关系,经过一番调研发现这里面的水还比较深,涉及天文学、历史、宗教等一些知识,发现挺有意思的就准备做一系列的总结,主要是防止自己忘记了,而且搜索了一下简书上的文章也么没有相关文章进行描述,所以借此机会跟...
摘要:透明表里的时间戳,数据类型为有个需求计算这两个时间戳之间的天数间隔,丢弃时间戳年月日位后面的小时分钟秒。直接用的字符串操作函数是不行的,因为时间戳类型和期待的字符串类型不匹配。 ABAP透明表里的时间戳,数据类型为dec: showImg(https://segmentfault.com/img/remote/1460000016828137); showImg(https://seg...
阅读 889·2023-01-14 11:38
阅读 833·2023-01-14 11:04
阅读 685·2023-01-14 10:48
阅读 1888·2023-01-14 10:34
阅读 892·2023-01-14 10:24
阅读 750·2023-01-14 10:18
阅读 479·2023-01-14 10:09
阅读 519·2023-01-14 10:02