您當前的位置:首頁 > 書法

Python + SeaTable | 計算兩個日期間的工作日天數

作者:由 SeaTable 發表于 書法時間:2023-01-05

當我們計算兩個日期間的間隔天數時,通常是用結束日期減去開始日期,但在實際的專案管理、任務管理、工作計劃等場景中,某些時間段會涉及雙休日、法定節假日,甚至還有公司自定義的工作時間安排,所以就需要計算出兩個日期間的實際工作日天數。比如一個表格中有多條任務,每條任務都有各自的開始日期、計劃結束日期或實際結束日期,那麼如何自動計算出兩個日期間的實際工作日天數,以便做到精細和量化呢。

此時,萬能的 Python 就可以出場了,而用 Python + SeaTable 來實現則會更加方便工作管理。本文重點分享思路和程式碼,僅供參考。

SeaTable 表格有豐富的資料型別,如日期、單選、協作人、公式、按鈕等等,可以方便又規範地管理各類資訊。此外,還有很多基礎功能和擴充套件功能,這其中就包括指令碼功能。在表格上點選“指令碼”按鈕,可以匯入或新建多個指令碼,隨時一鍵執行即可(如需設定定期執行等可在“自動化規則”中實現)。

比如在下面這個表格中,開始時間由專案管理者填寫; 結束時間由每個任務負責人在完成專案時填寫; 工作日(天數)則根據開始時間和結束時間,執行Python 指令碼計算得出。

Python + SeaTable | 計算兩個日期間的工作日天數

案例表格

在 SeaTable 表格上新建 Python 指令碼

具體來看。 首先, 我們開啟指令碼功能, 選擇“新建指令碼”, 選擇 Python。

Python + SeaTable | 計算兩個日期間的工作日天數

在表格上新建指令碼

思路

在開啟的介面中,就可以對指令碼進行編寫了。 在此處計算工作日的指令碼編寫過程中需要注意幾個問題, 以中國為例:

來年的工作日、休息日,暫不支援(因國家暫未釋出安排) 。

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

需要定義週末中工作的日期, 即週六、週日哪天調休。

程式碼

把以上的特殊日期一一列出來,這個指令碼就不難編寫了, 以下給出一些指令碼片段, 以2022年為例。

import

datetimefrom

enum

import

Enumfrom

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 來計算兩個日期間的工作日外,還可以使用表格的日曆外掛、時間線外掛、高階統計外掛等來進行檢視和做視覺化圖表分析,讓專案管理更方便,實現應用更簡單。

Python + SeaTable 案例

SeaTable:Python + SeaTable | 從啟信寶網站獲取公司融資等資訊至 SeaTable 表格SeaTable:Python + SeaTable | 用 Python 從維基百科抓取冬奧會城市資訊並製作地圖SeaTable:教程 | SeaTable 地理位置列、地圖外掛、高階統計中的地圖使用介紹SeaTable:同步伺服器日誌到 SeaTable,讓日誌更好的視覺化和協同處理

標簽: Day  date  SeaTable  value  2022