资讯专栏INFORMATION COLUMN

如何使用Python+SeaTable实现计算两个工作日天数

89542767 / 220人阅读

  小编写这篇文章的一个主要目的,主要是用来给大家继续讲解关于python的一些实例,比如综合运用Python+SeaTable,运用这个技能,可以实现相关的一些计算技能。比如可以实现连续性的计算两个工作日天数,下面给大家详细解答下。


  当我们计算两个日期间的间隔天数时,通常是用结束日期减去开始日期,但在实际的项目管理、任务管理、工作计划等场景中,某些时间段会涉及双休日、法定节假日,甚至还有公司自定义的工作时间安排,所以就需要计算出两个日期间的实际工作日天数。比如一个表格中有多条任务,每条任务都有各自的开始日期、计划结束日期或实际结束日期,那么如何自动计算出两个日期间的实际工作日天数,以便做到精细和量化呢。


  此时,万能的Python就可以出场了,而用Python+SeaTable来实现则会更加方便工作管理。本文重点分享思路和代码,仅供参考。


  SeaTable表格有丰富的数据类型,如日期、单选、协作人、公式、按钮等等,可以方便又规范地管理各类信息。此外,还有很多基础功能和扩展功能,这其中就包括脚本功能。在表格上点击“脚本”按钮,可以导入或新建多个脚本,随时一键运行即可(如需设置定期运行等可在“自动化规则”中实现)。


  比如在下面这个表格中,开始时间由项目管理者填写;结束时间由每个任务负责人在完成项目时填写;工作日(天数)则根据开始时间和结束时间,运行Python脚本计算得出。

01.png

  在SeaTable表格上新建Python脚本


  具体来看。首先,我们打开脚本功能,选择“新建脚本”,选择Python。

02.png

  思路


  在打开的界面中,就可以对脚本进行编写了。


  在此处计算工作日的脚本编写过程中需要注意几个问题,以中国为例:


  来年的工作日、休息日,暂不支持(因国家暂未发布安排)。


  需要定义平日中休息的日期,即周一到周五哪天休息。


  需要定义周末中工作的日期,即周六、周日哪天调休。


  代码


  把以上的特殊日期一一列出来,这个脚本就不难编写了,以下给出一些脚本片段,以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”说起

    摘要:缘起这几日闲来无事撸代码,无意中发现一桩趣事。原以为是一个的,没想到经过一系列死磕,挖掘出了一段和中国历史乃至人类文明相关联的人文故事,不禁唏嘘感叹一番。 缘起 这几日闲来无事撸代码,无意中发现一桩趣事。原以为是一个Java的bug,没想到经过一系列死磕,挖掘出了一段和中国历史乃至人类文明相关联的人文故事,不禁唏嘘感叹一番。 这件事的缘起很简单,我在实现计算两个日期天数距离逻辑的过程中...

    daryl 评论0 收藏0
  • [Python实践] 利用python实现的日期映射礼拜X的简单实现

    摘要:日期转换程序思想言归正传。下述代码以年与年为例,给出了两年每个月份的天数以及每年月日的礼拜日期,以此作为起点计算该年中任意一个日期的礼拜时间。 [Python实践] 利用python实现的日期映射礼拜X的简单实现 2018年12月19日 最近在处理分析数据的时候,突发奇想试着从用户离职的日期上判断是主动辞职还是被动解雇?数据的背景是美国某企业员工离职日期数据,根据美国常见的周薪/半月薪...

    Terry_Tai 评论0 收藏0
  • 算法——指定日期的星期推算

    摘要:儒略日就是指从公元前年月日开始所经过的天数,就被指定为公元前年月日到公元前年月日之间的小时,依次顺推,每一天都被赋予一个唯一的数字。   最近闲来无事,突然想了解下中国农历与中国阳历之间的关系,经过一番调研发现这里面的水还比较深,涉及天文学、历史、宗教等一些知识,发现挺有意思的就准备做一系列的总结,主要是防止自己忘记了,而且搜索了一下简书上的文章也么没有相关文章进行描述,所以借此机会跟...

    AbnerMing 评论0 收藏0
  • 如何计算CDS view里两个时间戳之间的天数间隔

    摘要:透明表里的时间戳,数据类型为有个需求计算这两个时间戳之间的天数间隔,丢弃时间戳年月日位后面的小时分钟秒。直接用的字符串操作函数是不行的,因为时间戳类型和期待的字符串类型不匹配。 ABAP透明表里的时间戳,数据类型为dec: showImg(https://segmentfault.com/img/remote/1460000016828137); showImg(https://seg...

    selfimpr 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<