获取 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
).
如果只需要标准库,这里是 calendar
和 datetime
:
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
我想要接下来三个月的每个月的最后一个星期五。
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
).
如果只需要标准库,这里是 calendar
和 datetime
:
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