获取 python 中每个月的最后一个星期五

Get last friday of each month in python

我想要接下来三个月的每个月的最后一个星期五。

Friday_date = datetime.date.today()

    while Friday_date.weekday() != 4:
        Friday_date += datetime.timedelta(1)

这给了我最近的星期五。我想确保这是本月的最后一个星期五,这样我就可以添加 28 天以获得下一个星期五。

如果你想知道最后一个星期五,你可以这样做:

from datetime import date
from datetime import timedelta

today = date.today()
offset = (today.weekday() - 4) % 7
last_wednesday = today - timedelta(days=offset)

最简单的方法是使用模块 dateutil:

>>> from dateutil.relativedelta import FR, relativedelta
>>> datetime.date.today()+relativedelta(day=31, weekday=FR(-1))
datetime.date(2021, 6, 25)

不要以为只要加上 28 天就可以得到后续月份的最后一个星期五。它并不总是有效。将 28 天添加到 2024 年 2 月的最后一个星期五,您将得到:

>>> datetime.date(2024,2,1)+relativedelta(day=31, weekday=FR(-1), days=28)
datetime.date(2024, 3, 22)

但那个月的最后一个星期五是 3 月 29 日。让 dateutil 为您正确地做到这一点:

>>> datetime.date(2024,2,1)+relativedelta(day=31, weekday=FR(-1), months=1)
datetime.date(2024, 3, 29)

这个公式可以得到任何给定月份的最后一个星期五:

import calendar

year = 2021
month = 6

last_day = calendar.monthrange(year, month)[1]
last_weekday = calendar.weekday(year, month, last_day)
last_friday = last_day - ((7 - (4 - last_weekday)) % 7)
#                          ^    ^
#                          |    Friday
#                          days in a week

这是我的第一杯咖啡,所以这可能会浓缩一点,但它说明了逻辑。 last_day 是最后一个日历日(6 月是 30),last_weekday 是工作日(2 是星期三),我们根据这个简单地计算减去多少天才能落地上周五 (25).

如果只需要标准库,这里是 calendardatetime:

import calendar
from datetime import date

today = date.today()
year, month = today.year, today.month

n_months = 4
friday = calendar.FRIDAY

for _ in range(n_months):
    # get last friday
    c = calendar.monthcalendar(year, month)
    day_number = c[-1][friday] or c[-2][friday]

    # display the found date
    print(date(year, month, day_number))

    # refine year and month
    if month < 12:
        month += 1
    else:
        month = 1
        year += 1

c[-1][friday] or c[-2][friday] 行首先检查该月的最后一周:那里的星期五是否非零?如果是这样就接受它,否则看看前一周那里必须是星期五。

这会打印

2021-06-25
2021-07-30
2021-08-27
2021-09-24