当前位置: 首页 > 后端技术 > Python

Python+海表-计算两个日期之间的工作天数

时间:2023-03-25 23:45:29 Python

我们在计算两个日期之间的天数时,通常会用结束日期减去开始日期,但是在实际的项目管理、任务管理、工作计划等场景中,一些时间段涉及双休日、法定节假日,甚至公司规定的作息时间,因此需要计算两个日期之间的实际工作天数。例如,一个表中有多个任务,每个任务都有自己的开始日期、计划结束日期或实际结束日期,那么如何自动计算这两个日期之间的实际工作天数,以实现精确和量化。至此,万能的Python就可以出来了,工作管理用Python+SeaTable来实现会更方便。本文重点分享思路和代码,仅供参考。SeaTable表格拥有丰富的数据类型,如日期、单选、协作者、公式、按钮等,可以方便、规范地管理各类信息。此外,还有许多基本功能和扩展功能,包括脚本功能。点击表格上的“脚本”按钮,可以导入或创建多个脚本,随时一键运行(如需设置定时运行等,可在“自动化规则”中实现).比如下表,开始时间由项目经理填写;结束时间由各任务负责人在完成项目时填写;工作日(天数)是通过运行基于开始时间和结束时间的Python脚本来计算的。在SeaTable表上创建一个新的Python脚本以获取详细信息。首先,我们打开脚本功能,选择“新建脚本”,选择Python。思路是在打开的界面中,可以写脚本。这里计算工作日的脚本编写过程中有几个问题需要注意。以中国为例:暂不支持来年的工作日和休息日(因为国内还没有出台安排)。需要定义工作日的休息日,即周一至周五哪一天休息。需要定义周末期间的工作日,即星期六或星期日哪一天是假期。代码将以上特殊日期一一列出,这个脚本不难写。下面是一些脚本片段,以2022为例。importdatetimefromenumimportEnumfromseatable_apiimportdateutils,Base,context#Base的授权信息SERVER_URL=context.server_urlor'https://cloud.seatable.cn'API_TOKEN=context.api_tokenor'dd46f9ca0172a850a0922107a6b2e6b9'国内定义1假期概览类Holiday(Enum):new_years_day="元旦"spring_festival="春节"tomb_sweeping_day="清明"labor_day="劳动节"dragon_boat_festival="端午节"national_day="国庆节"mid_autumn_festival="中秋节"AutumnFestival》#2.list假期列表,这里可以查看日历,不一一列出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.定义是否为工作日defis_workday(date):'''工作日的定义:1.工作日字典的key中有日期2.星期是星期一到星期五,不在holidays字典的key中'''date=_validate_date(date)weekday=date.weekday()returnbool(dateinworkdays.keys()or(weekday<=4anddatenotinholidays.keys()))#5.计算工作日有两个日期,这里返回工作日列表,列表长度为工作日数defget_workdays(start,end):"""获取两个日期之间的工作日,返回datetimeList"""start,end=_validate_date(start,end)returnlist(filter(is_workday,get_dates(start,end)))#6.将结果写入SeaTabledefcalculate_base_workdays(base,table_name):'''通过seatabletable中,开始日期,结束日期,计算两个日期之间的工作日天数,更新为row'''forrowinbase.list_rows(table_name)中的工作日字段:row_id=row.get('_id')start_date=row.get("Startdate")end_date=row.get("Enddate")ifnot(start_dateandend_date):continuetry:work_day_list=get_workdays(start_date,end_date)#在两个日期之间work_day_counts=len(work_day_list)cell_value=row.get("workday")ifcell_value==work_day_counts:continuebase.update_row(table_name,row_id,{"workday":work_day_counts})except除外onase:print("开始日期:%s,结束日期:%s,错误:%s"%(start_date,end_date,e))continuebase=Base(API_TOKEN,SERVER_URL)base.auth()calculate_base_workdays(base,《安排工作任务》)完整的脚本可以参考(链接):计算工作天数的Python脚本。管理和处理当我们需要快速开发自定义数据处理流程时,可以使用其完整的PythonAPI功能,可以节省大量的成本。具体在本案例中,除了使用Python计算两个日期之间的工作日外,还可以使用表格的日历插件、时间线插件、高级统计插件进行查看和可视化图表分析,让项目管理更方便。实施应用程序更简单。参考案例Python+SeaTable|从七信宝网站获取公司融资等信息到SeaTableformPython+SeaTable|使用Python从维基百科抓取冬奥城市信息并制作地图将服务器日志同步到SeaTable,更好的可视化日志和协处理