【Python】dateオブジェクトの活用事例20選

Python
この記事は約12分で読めます。

こんにちは、JS2IIUです。
dateオブジェクトとtimedeltaオブジェクトを組み合わせることで、実に様々な日付計算が可能です。ここでは、先ほどの10個に加えて、さらに10個の異なる日付計算の事例を紹介します。合計20個の例を通して、dateオブジェクトの活用方法をマスターしましょう。

datetimeモジュールの基本的な使い方はこちらの記事を参考にして下さい。

dateオブジェクトを使った日付計算の20個の事例

1. 今日の100日後の日付を求める

「100日」を足す部分はtimedeltaオブジェクトを使っています。

Python
import datetime

today = datetime.date.today()
hundred_days_later = today + datetime.timedelta(days=100)

print(f"今日は{today}です。")
print(f"100日後は{hundred_days_later}です。")

2. 特定の日付から3週間前の日付を求める

Python
import datetime

date1 = datetime.date(2024, 1, 1)
three_weeks_ago = date1 - datetime.timedelta(weeks=3)

print(f"{date1}の3週間前は{three_weeks_ago}です。")

3. 2つの日付の間の日数を計算する

dateオブジェクト同士の引き算で2つの日付の間の日数が求められます。引き算の結果が格納されているdays_betweenのtypeは<class 'datetime.timedelta'>です。

Python
import datetime

date1 = datetime.date(2023, 12, 1)
date2 = datetime.date(2024, 1, 15)
days_between = date2 - date1

print(f"{date1}{date2}の間は{days_between.days}日です。")

4. 特定の月の月末日を求める

Python
import datetime

year = 2024
month = 2

# 翌月の1日を求める
next_month = datetime.date(year, month + 1, 1) 
# 1日前に戻って月末日を求める
last_day = next_month - datetime.timedelta(days=1)

print(f"{year}{month}月の月末日は{last_day}です。")

5. 特定の月の月初日を求める

Python
import datetime

year = 2024
month = 2

first_day = datetime.date(year, month, 1)

print(f"{year}{month}月の月初日は{first_day}です。")

6. 特定の日付の次の日曜日を求める

Python
import datetime

date1 = datetime.date(2024, 12, 18)
# 曜日の数値を取得 (月曜日が0、日曜日が6)
day_of_week = date1.weekday()
# 次の日曜日までの日数を計算
days_to_next_sunday = 6 - day_of_week + 7 * (day_of_week == 6) 
# 次の日曜日を求める
next_sunday = date1 + datetime.timedelta(days=days_to_next_sunday)

print(f"{date1}の次の日曜日は{next_sunday}です。")

7. 特定の日付がうるう年かどうかを判定する

Python
import datetime

def is_leap_year(year):
  """
  特定の年がうるう年かどうかを判定する関数

  Args:
    year: 年

  Returns:
    うるう年ならTrue、そうでなければFalse
  """
  try:
    datetime.date(year, 2, 29)
    return True
  except ValueError:
    return False

year = 2024
if is_leap_year(year):
  print(f"{year}年はうるう年です。")
else:
  print(f"{year}年はうるう年ではありません。")

8. 特定の日付から1年後の日付を求める

Python
import datetime

date1 = datetime.date(2024, 2, 29)

# うるう年の2月29日の場合、1年後は3月1日になる
try:
  one_year_later = datetime.date(date1.year + 1, date1.month, date1.day)
except ValueError:
  one_year_later = datetime.date(date1.year + 1, 3, 1)

print(f"{date1}の1年後は{one_year_later}です。")

9. 特定の日付の曜日を日本語で取得する

Python
import datetime

date1 = datetime.date(2024, 12, 18)
day_of_week = date1.weekday()
days = ["", "", "", "", "", "", ""]

print(f"{date1}{days[day_of_week]}曜日です。")

10. 2つの日付の間の週数を計算する

Python
import datetime

date1 = datetime.date(2024, 1, 1)
date2 = datetime.date(2024, 12, 31)
weeks_between = (date2 - date1).days // 7

print(f"{date1}{date2}の間は{weeks_between}週間です。")

11. 特定の日付の前の金曜日を求める

Python
import datetime

date1 = datetime.date(2024, 12, 18)
# 曜日の数値を取得 (月曜日が0、日曜日が6)
day_of_week = date1.weekday()
# 前の金曜日までの日数を計算
days_to_last_friday = day_of_week - 4 + 7 * (day_of_week < 4)
# 前の金曜日を求める
last_friday = date1 - datetime.timedelta(days=days_to_last_friday)

print(f"{date1}の前の金曜日は{last_friday}です。")

12. 特定の日付が第何週目かを求める

Python
import datetime

date1 = datetime.date(2024, 12, 18)
# 年初からの日数を計算
days_from_year_start = (date1 - datetime.date(date1.year, 1, 1)).days
# 第何週目かを求める
week_number = (days_from_year_start // 7) + 1

print(f"{date1}{date1.year}年の第{week_number}週目です。")

13. 特定の年の特定の月の第n曜日の日付を求める

Python
import datetime

def get_nth_weekday_of_month(year, month, weekday, n):
  """
  特定の年の特定の月の第n曜日の日付を求める関数

  Args:
    year: 年
    month: 月
    weekday: 曜日 (0:月曜日, 1:火曜日, ..., 6:日曜日)
    n: 第n曜日 (1, 2, 3, 4, 5)

  Returns:
    日付
  """
  first_day = datetime.date(year, month, 1)
  # 月初日の曜日
  first_day_weekday = first_day.weekday()
  # 第1曜日の日付
  first_weekday_date = first_day + datetime.timedelta(days=(weekday - first_day_weekday) % 7)
  # 第n曜日の日付
  nth_weekday_date = first_weekday_date + datetime.timedelta(weeks=(n - 1))
  return nth_weekday_date

# 2024年12月の第3水曜日を求める
third_wednesday = get_nth_weekday_of_month(2024, 12, 2, 3)  # 2は水曜日
print(f"2024年12月の第3水曜日は{third_wednesday}です。")

14. 特定の日付からn営業日後の日付を求める (土日を除く)

Python
import datetime

def get_business_day_after(date1, n):
  """
  特定の日付からn営業日後の日付を求める関数 (土日を除く)

  Args:
    date1: 日付
    n: 営業日数

  Returns:
    日付
  """
  current_date = date1
  business_days_counted = 0
  while business_days_counted < n:
    current_date += datetime.timedelta(days=1)
    # 土日を除く
    if current_date.weekday() < 5:
      business_days_counted += 1
  return current_date

# 2024年12月18日から5営業日後の日付を求める
business_day_after = get_business_day_after(datetime.date(2024, 12, 18), 5)
print(f"2024年12月18日から5営業日後は{business_day_after}です。")

15. 特定の日付が年の何日目かを求める

Python
import datetime

date1 = datetime.date(2024, 12, 18)
day_of_year = date1.timetuple().tm_yday

print(f"{date1}は、{date1.year}年の{day_of_year}日目です。")

16. 特定の日付の月の最終週の月曜日を求める

Python
import datetime

def get_last_monday_of_month(year, month):
  """
  特定の月の最終週の月曜日を求める関数

  Args:
    year: 年
    month: 月

  Returns:
    日付
  """
  # 翌月の1日を求める
  next_month = datetime.date(year, month + 1, 1) 
  # 1日前に戻って月末日を求める
  last_day = next_month - datetime.timedelta(days=1)
  # 月末日の曜日を取得
  last_day_weekday = last_day.weekday()
  # 最終週の月曜日までの日数を計算
  days_to_last_monday = last_day_weekday - 0 + 7 * (last_day_weekday < 0)
  # 最終週の月曜日を求める
  last_monday = last_day - datetime.timedelta(days=days_to_last_monday)
  return last_monday

# 2024年12月の最終週の月曜日を求める
last_monday = get_last_monday_of_month(2024, 12)
print(f"2024年12月の最終週の月曜日は{last_monday}です。")

17. 特定の日付が年の第何週目かを求める (ISO 8601)

Python
import datetime

date1 = datetime.date(2024, 12, 18)
iso_week_number = date1.isocalendar().week

print(f"{date1}は、ISO 8601の{date1.year}年の第{iso_week_number}週目です。")

18. 特定の日付の四半期を求める

Python
import datetime

date1 = datetime.date(2024, 12, 18)
quarter = (date1.month - 1) // 3 + 1

print(f"{date1}は、{date1.year}年の第{quarter}四半期です。")

19. 特定の日付が祝日かどうかを判定する (日本の祝日)

Python
import datetime
import holidays

def is_holiday_japan(date1):
  """
  特定の日付が日本の祝日かどうかを判定する関数

  Args:
    date1: 日付

  Returns:
    祝日ならTrue、そうでなければFalse
  """
  jp_holidays = holidays.Japan()
  return date1 in jp_holidays

date1 = datetime.date(2024, 12, 23)
if is_holiday_japan(date1):
  print(f"{date1}は祝日です。")
else:
  print(f"{date1}は祝日ではありません。")

20. 特定の日付の翌月の第2火曜日を求める

Python
import datetime

def get_second_tuesday_of_next_month(date1):
  """
  特定の日付の翌月の第2火曜日を求める関数

  Args:
    date1: 日付

  Returns:
    日付
  """
  # 翌月の1日を求める
  next_month_first_day = datetime.date(date1.year + (date1.month == 12), (date1.month % 12) + 1, 1)
  # 翌月の第2火曜日を求める
  second_tuesday = get_nth_weekday_of_month(next_month_first_day.year, next_month_first_day.month, 1, 2)  # 1は火曜日
  return second_tuesday

# 2024年11月15日の翌月の第2火曜日を求める
second_tuesday = get_second_tuesday_of_next_month(datetime.date(2024, 11, 15))
print(f"2024年11月15日の翌月の第2火曜日は{second_tuesday}です。")

まとめ

これらの例を通して、dateオブジェクトとtimedeltaオブジェクトを組み合わせることで、多様な日付計算に対応できることがご理解いただけたかと思います。

最後まで読んでいただきありがとうございます。73

コメント

タイトルとURLをコピーしました