網(wǎng)站首頁 編程語言 正文
當我們計算兩個日期間的間隔天數(shù)時,通常是用結束日期減去開始日期,但在實際的項目管理、任務管理、工作計劃等場景中,某些時間段會涉及雙休日、法定節(jié)假日,甚至還有公司自定義的工作時間安排,所以就需要計算出兩個日期間的實際工作日天數(shù)。比如一個表格中有多條任務,每條任務都有各自的開始日期、計劃結束日期或實際結束日期,那么如何自動計算出兩個日期間的實際工作日天數(shù),以便做到精細和量化呢。
此時,萬能的 Python 就可以出場了,而用 Python + SeaTable 來實現(xiàn)則會更加方便工作管理。本文重點分享思路和代碼,僅供參考。
SeaTable 表格有豐富的數(shù)據(jù)類型,如日期、單選、協(xié)作人、公式、按鈕等等,可以方便又規(guī)范地管理各類信息。此外,還有很多基礎功能和擴展功能,這其中就包括腳本功能。在表格上點擊“腳本”按鈕,可以導入或新建多個腳本,隨時一鍵運行即可(如需設置定期運行等可在“自動化規(guī)則”中實現(xiàn))。
比如在下面這個表格中,開始時間由項目管理者填寫; 結束時間由每個任務負責人在完成項目時填寫; 工作日(天數(shù))則根據(jù)開始時間和結束時間,運行 Python 腳本計算得出。
在 SeaTable 表格上新建 Python 腳本
具體來看。 首先, 我們打開腳本功能, 選擇“新建腳本”, 選擇 Python。
思路
在打開的界面中,就可以對腳本進行編寫了。
在此處計算工作日的腳本編寫過程中需要注意幾個問題, 以中國為例:
- 來年的工作日、休息日,暫不支持(因國家暫未發(fā)布安排) 。
- 需要定義平日中休息的日期, 即周一到周五哪天休息。
- 需要定義周末中工作的日期, 即周六、周日哪天調休。
代碼
把以上的特殊日期一一列出來,這個腳本就不難編寫了, 以下給出一些腳本片段, 以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. 定義中國的節(jié)假日概況
class Holiday(Enum):
new_years_day = "元旦"
spring_festival = "春節(jié)"
tomb_sweeping_day = "清明"
labour_day ="勞動節(jié)"
dragon_boat_festival = "端午"
national_day = "國慶節(jié)"
mid_autumn_festival = "中秋"
# 2. 列出節(jié)假日列表, 此處可以去查詢日歷,就不一一列出了
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. 計算兩個日期之間的工作日, 此處返回的是工作日的列表, 該列表的長度即是工作日的天數(shù)
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表格中的,開始日期, 結束日期, 計算兩個日期間工作日的天數(shù),并把其更新到該行的
工作日字段中
'''
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)
# 兩個日期間的工作日天數(shù)
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 作為一款以在線協(xié)同表格為基礎的新型數(shù)字化平臺,功能豐富,使用靈活,能幫我們實現(xiàn)一體化數(shù)據(jù)管理和處理。當我們需要快速地開發(fā)自定義數(shù)據(jù)處理流程時,就可以使用它完善的 Python API 功能,能節(jié)省很多成本。具體到本案例中,除了使用 Python 來計算兩個日期間的工作日外,還可以使用表格的日歷插件、時間線插件、高級統(tǒng)計插件來進行查看和做可視化圖表分析,讓項目管理更方便,實現(xiàn)應用更簡單。
原文鏈接:https://segmentfault.com/a/1190000042076098
相關推薦
- 2023-07-15 ubuntu 服務器安裝配置VNC訪問
- 2022-06-10 ASP.NET?Core使用EF保存數(shù)據(jù)、級聯(lián)刪除和事務使用_實用技巧
- 2022-11-02 python函數(shù)和python匿名函數(shù)lambda詳解_python
- 2022-11-12 Redis主從復制操作和配置詳情_Redis
- 2022-11-29 ASP.NET?Identity的基本用法_實用技巧
- 2022-06-13 matplotlib圖形整合之多個子圖繪制的實例代碼_python
- 2023-01-03 Android序列化實現(xiàn)接口Serializable與Parcelable詳解_Android
- 2022-08-04 docker安裝elastic?search的詳細過程_docker
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支