Есть ли функция для нахождения N-го дня недели месяца для заданной даты в python?

#python #datetime

#python #datetime

Вопрос:

Допустим, у меня есть дата 12/8/2020. Есть ли функция, которая выводила бы, что это был 2-й вторник декабря?

Кроме того, я хотел бы найти способ сделать обратное. Введите 2-й вторник декабря 2020 года, и он выведет 12/8/2020.

Комментарии:

1. Что, если кто-то спросит 6-й вторник декабря?

2. Предположим, что никто этого не сделает, ха-ха. У меня хорошие друзья

Ответ №1:

datetime модуль (или дружественная версия с оболочкой pandas) обладает большей частью необходимой вам функциональности. Вы можете использовать humanize (или написать свою собственную) функцию для преобразования числа в ординальность:

 import pandas as pd
import humanize
def day_in_month(date_str):

    dt = pd.to_datetime(date_str)
    dow = dt.day_name()
    dow_ord = 1   (dt.day - 1)//7
    dow_ord_str = humanize.ordinal(dow_ord)
    month = dt.month_name()
    year = dt.year
    output = f"{dow_ord_str} {dow} of {month} in {year}" 
    return output

date_str = "12/8/2020"
day_in_month(date_str)
 

вывод:

 '2nd Tuesday of December in 2020'
 

Комментарии:

1. Есть ошибка, dow_ord = 1 dt.day // 7 и я не могу ее хорошо объяснить, но dow_ord = math.ceil(dt.day / 7) даст правильный результат. (Необходимо импортировать математику) В том виде, в котором он находится сейчас, он увеличивает порядковый номер на один раз раньше.

2. То есть он неправильно скажет 2nd понедельник 7 декабря. когда он должен сказать 1st понедельник. для 7 декабря (2020) (то же самое происходит 14,21 и 28)

3. Хорошо, я работал над этим сам. Я не знал о пакете humanize — рад его видеть.