【问题标题】:Get last friday of each month in python在python中获取每个月的最后一个星期五
【发布时间】:2021-06-17 07:12:14
【问题描述】:

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

Friday_date = datetime.date.today()

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

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

【问题讨论】:

  • 获取下个月的第一天,然后减去一个。然后查看该日期的工作日,您可以轻松计算偏移量。
  • 有了这个答案,您可以找到一年中的所有星期五:stackoverflow.com/questions/2003870/…
  • 我不希望所有星期五..检查..
  • 我想上周五下个 3-4 个月..
  • 您知道如何计算任何给定月份的最后一个星期五吗?那么用它来计算接下来的 3 应该不难……

标签: python datetime calendar python-datetime


【解决方案1】:

如果只需要标准库,这里是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

【讨论】:

  • 这应该是对原始 PO 的正确答案。
【解决方案2】:

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

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 是星期三),基于此我们简单地计算要减去多少天才能在最后一个星期五降落(@ 987654325@)。

【讨论】:

    【解决方案3】:

    最简单的方法是使用模块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)
    

    【讨论】:

    • 这是本月的最后一个星期五,我可以轻松添加 28 来获得接下来的几个月。
    • 小心只添加 28 天。它不会总是奏效。 datetime.date(2024,2,1)+relativedelta(day=31, weekday=FR(-1), weeks=4) 给出 2024 年 3 月 22 日,但该月的最后一个星期五是 3 月 29 日。但是datetime.date(2024,2,1)+relativedelta(day=31, weekday=FR(-1), months=1)给了你正确的答案。
    【解决方案4】:

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

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

    【讨论】:

    • OP 想要本月的最后一个星期五,而不是上一个星期五
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多