【Python】各種日付の計算を関数にまとめたもの
処理概要
日付の計算機能を関数にまとめまています。
与えられた2つの日付データから日数の差を計算して返す
機能概要
- ファイル名:date_difference.py
- 関数名:diff
- 引数
- date1(str)
- date2(str)
- 形式:'yyyy/m/d' または 'yyyy/mm/dd'
- 戻り値
- int:日数
コード
from datetime import datetime
def diff(date1: str, date2: str) -> int:
# 日付をyyyy/m/d形式にする
date_format = '%Y/%m/%d'
# 日付を変換してから計算する
d1 = datetime.strptime(date1, date_format)
d2 = datetime.strptime(date2, date_format)
delta = abs((d2 - d1).days)
return delta
使い方
import date_difference as dd date1 = '2024/8/5' date2 = '2024/8/6' print(dd.diff(date1, date2))
実行結果
1
与えられた2つの日付データからどちらが未来日であるか判定して結果を返す
機能概要
- ファイル名:compare_dates.py
- 関数名:compare
- 引数
- date1(str)
- date2(str)
- 形式:'yyyy/m/d' または 'yyyy/mm/dd'
- 戻り値
- str:判定結果のメッセージ
コード
from datetime import datetime
def compare(date1: str, date2: str) -> str:
# 日付をyyyy/m/d形式にする
date_format = '%Y/%m/%d'
# 日付を変換してから比較する
d1 = datetime.strptime(date1, date_format)
d2 = datetime.strptime(date2, date_format)
if d1 > d2:
return f'{date1} の方が未来日です'
elif d1 < d2:
return f'{date2} の方が未来日です'
else:
return r'同じ日付です'
使い方①
import compare_dates as cd date1 = '2024/08/10' date2 = '2024/08/25' print(cd.compare(date1, date2))
実行結果①
2024/08/25 の方が未来日です
使い方②
import compare_dates as cd date1 = '2024/08/25' date2 = '2024/08/25' print(cd.compare(date1, date2))
実行結果②
同じ日付です
与えられた日付(未来日)までの営業日を返す関数
機能概要
- ファイル名:business_days.py
- 関数名: count
- 引数
- file_path (str, pathlib.WindowsPath): Excelファイルのパス
- future_date (str): 未来日
- sheet_name (str, optional): シート名
- 形式: 'yyyy/m/d' または 'yyyy/mm/dd'
- 戻り値
- int:未来日から非営業日を減算した日数
インプットとなるExcelファイル
- ファイル名:non_business_days.xlsx
- 非営業日の一覧をExcelファイルのA列に記載する
- シート名の指定がない場合は先頭シートを対象とする
- A1セルはヘッダ名として 非営業日 を記載する
- A2セル以降にyyyy/m/d形式で非営業日を記載する
ファイル入力例

コード
import pandas as pd
from datetime import datetime
def non_business_days_read(file_path: str, sheet_name: str = None) -> pd.DataFrame:
if sheet_name:
df = pd.read_excel(file_path, sheet_name=sheet_name, usecols='A')
else:
df = pd.read_excel(file_path, usecols='A')
df['非営業日'] = pd.to_datetime(df['非営業日']).dt.strftime('%Y/%m/%d')
return df
def count(file_path: str, future_date: str, sheet_name: str = None) -> int:
# Excelファイルから非営業日一覧を取得する
df = non_business_days_read(file_path, sheet_name)
# 非営業日をリストに変換する
non_business_days = pd.to_datetime(df.iloc[:, 0], format='%Y/%m/%d')
# 未来日を計算可能な形式に変換する
future_date_obj = datetime.strptime(future_date, '%Y/%m/%d')
# 非営業日一覧からすでに経過しているものを除く
non_business_days = non_business_days[non_business_days >= datetime.today()]
# 未来日までに設定されている非営業日を抽出する
non_business_days_until_future = non_business_days[non_business_days <= future_date_obj]
# 残った非営業日数
non_business_days_count = len(non_business_days_until_future)
# 未来日までの日数を計算する ※営業日の考え方で加算日を調整
total_days = (future_date_obj - datetime.today()).days + 1
# 非営業日を減算し営業日数を計算する
business_days = total_days - non_business_days_count
return business_days
使い方①
2024年8月4日に実行したもの
import business_days as bd from pathlib import Path file_path = Path.cwd() / 'non_business_days.xlsx' future_date = '2024/08/13' print(bd.count(file_path, future_date))
実行結果①
6
使い方②
シート名(Sheet1)を指定する場合
import business_days as bd from pathlib import Path file_path = Path.cwd() / 'non_business_days.xlsx' sheet_name = 'Sheet1' future_date = '2024/08/13' print(bd.count(file_path, future_date, sheet_name))
実行結果②
6
指定した日付から指定した営業日数を引いた日付を返す関数
機能概要
- ファイル名:business_days.py
- 関数名: calc_minus
- 引数
- file_path (str, pathlib.WindowsPath): Excelファイルのパス
- target_date (str): ターゲットとなる日付
- days_to_subtract (int): ターゲットの日付から引く営業日数
- sheet_name (str, optional): シート名
- 形式: 'yyyy/m/d' または 'yyyy/mm/dd'
- 戻り値
- str: 指定した日付から指定した営業日数を引いた日付
インプットとなるExcelファイル
- インプットに関してはcountと同じ
コード
import pandas as pd
from datetime import datetime
def non_business_days_read(file_path: str, sheet_name: str = None) -> pd.DataFrame:
if sheet_name:
df = pd.read_excel(file_path, sheet_name=sheet_name, usecols='A')
else:
df = pd.read_excel(file_path, usecols='A')
df['非営業日'] = pd.to_datetime(df['非営業日']).dt.strftime('%Y/%m/%d')
return df
def subtract_business_days(file_path: str, target_date: str, days_to_subtract: int, sheet_name: str = None) -> str:
# Excelファイルから非営業日一覧を取得する
df = non_business_days_read(file_path, sheet_name)
# 非営業日をリストに変換する
non_business_days = pd.to_datetime(df.iloc[:, 0], format='%Y/%m/%d')
# 指定する未来日と比較できる形式に変換する
non_business_days = non_business_days.apply(lambda x: x.strftime('%Y/%m/%d')).tolist()
target_date_obj = datetime.strptime(target_date, '%Y/%m/%d')
# 指定日の非営業日チェック
if target_date in non_business_days:
print('指定した日付は非営業日です')
# 営業日数を計算
while business_days_to_subtract > 0:
target_date_obj -= pd.Timedelta(days=1)
if target_date_obj.strftime('%Y/%m/%d') not in non_business_days:
business_days_to_subtract -= 1
result_date = target_date_obj.strftime('%Y/%m/%d')
return result_date
使い方①
2024年8月14日の3営業日前の日付を表示する
import business_days as bd from pathlib import Path file_path = Path.cwd() / 'non_business_days.xlsx' target_date = '2024/08/14' days_to_subtract = 3 print(bd.calc_minus(file_path, target_date, days_to_subtract))
実行結果①
2024/08/08
使い方②
シート名(Sheet1)を指定する場合
import business_days as bd from pathlib import Path file_path = Path.cwd() / 'non_business_days.xlsx' sheet_name = 'Sheet1' target_date = '2024/08/14' days_to_subtract = 3 print(bd.calc_minus(file_path, target_date, days_to_subtract, sheet_name))
実行結果②
2024/08/08