5 способов определить день недели по дате в Python: готовые методы

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Python-разработчики, работающие с временными данными
  • Студенты и обучающиеся, стремящиеся освоить практические навыки программирования
  • Специалисты по анализу данных и бизнес-приложений, нуждающиеся в обработке дат

    Определение дня недели по дате — задача, с которой сталкивается любой разработчик, работающий с временными данными. От управления расписаниями до анализа бизнес-активности по дням недели — эта функциональность критична для множества приложений. Python предоставляет разнообразные инструменты для элегантного решения этой задачи без необходимости изобретать велосипед. Давайте рассмотрим пять проверенных методов с готовыми примерами, которые вы сможете интегрировать в свой код уже сегодня. 🐍

Работа с датами — фундаментальный навык для Python-разработчика. На курсе Обучение Python-разработке от Skypro вы не только освоите базовые и продвинутые методы работы с временными данными, но и научитесь интегрировать их в реальные веб-проекты. От обработки пользовательского ввода до анализа временных рядов — наши эксперты раскроют все секреты эффективной работы с datetime, calendar и другими библиотеками.

Получение дня недели по дате в Python: обзор задачи

Задача определения дня недели по заданной дате возникает при решении множества практических задач: планировании бизнес-процессов, автоматизации расписаний, анализе данных и построении прогнозных моделей. Python предлагает разработчику несколько вариантов для её решения, от встроенных модулей до специализированных сторонних библиотек.

Представим сценарий: необходимо автоматически распределять задачи между сотрудниками в зависимости от дня недели. Или другой вариант: анализируем продажи интернет-магазина и хотим установить, в какие дни недели наблюдается пик активности. В этих и множестве других случаев требуется преобразовать дату в день недели.

Александр Петров, Lead Python-разработчик

Однажды я работал над проектом прогнозирования загруженности ресторана. Клиент хотел понимать, сколько персонала нужно ставить в смену на каждый день недели. У нас были исторические данные о посещаемости за два года, но все в формате дат. Пришлось конвертировать каждую запись в соответствующий день недели.

Сначала я использовал простое решение через datetime.weekday(), но быстро столкнулся с проблемой: данные содержали даты в разных форматах. Некоторые были строками, другие — временными метками. Пришлось создать универсальный конвертер, который определял тип входных данных и применял соответствующий метод преобразования. В итоге обработка 700,000 записей заняла менее минуты, а клиент получил чёткую картину: вторник и суббота были самыми загруженными днями, что полностью противоречило его интуитивным предположениям.

Для решения задачи определения дня недели в Python существует несколько подходов:

  • Использование встроенного модуля datetime и его метода weekday()
  • Применение функций из модуля calendar
  • Форматирование даты через strftime() для получения текстового представления
  • Использование сторонних библиотек, таких как pandas или arrow
  • Ручное вычисление с помощью алгоритмов (например, алгоритм Зеллера)

Каждый из этих методов имеет свои преимущества и ограничения, которые мы рассмотрим в следующих разделах. Выбор конкретного подхода зависит от ваших требований к производительности, читаемости кода и формату представления результата. 🔍

Пошаговый план для смены профессии

Метод datetime.weekday(): числовое представление дня недели

Модуль datetime — это базовый инструмент Python для работы с датами и временем. Метод weekday() объекта datetime предоставляет простой и эффективный способ получить числовое представление дня недели.

Важно понимать, что weekday() возвращает число от 0 до 6, где 0 соответствует понедельнику, а 6 — воскресенью. Это соответствует международному стандарту ISO, но может отличаться от локальных конвенций в некоторых странах.

Рассмотрим базовый пример использования:

Python
Скопировать код
from datetime import datetime

# Создаем объект datetime для конкретной даты
date = datetime(2023, 10, 15) # 15 октября 2023 года

# Получаем день недели как число
weekday_number = date.weekday()

print(f"День недели для {date.strftime('%Y-%m-%d')}: {weekday_number}")
# Вывод: День недели для 2023-10-15: 6

Если вам нужно работать с текущей датой, код упрощается:

Python
Скопировать код
from datetime import datetime

# Получаем текущую дату и время
now = datetime.now()

# Получаем день недели
weekday_number = now.weekday()

print(f"Сегодня день недели с номером: {weekday_number}")

Для преобразования числового представления в понятное название дня недели можно использовать список:

Python
Скопировать код
weekdays = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"]
date = datetime(2023, 10, 15)
weekday_number = date.weekday()

print(f"{date.strftime('%Y-%m-%d')} — это {weekdays[weekday_number]}")
# Вывод: 2023-10-15 — это Воскресенье

Существует также метод isoweekday(), который возвращает значения от 1 (понедельник) до 7 (воскресенье), что может быть более интуитивно для некоторых пользователей:

Python
Скопировать код
from datetime import datetime

date = datetime(2023, 10, 15)
iso_weekday = date.isoweekday()

print(f"ISO день недели: {iso_weekday}") # Вывод: ISO день недели: 7

Метод Диапазон значений Понедельник Воскресенье Соответствие стандарту
weekday() 0-6 0 6 ISO 8601
isoweekday() 1-7 1 7 ISO 8601

Преимущества метода weekday():

  • Входит в стандартную библиотеку Python, не требует установки дополнительных пакетов
  • Высокая производительность и оптимизация
  • Простота использования
  • Надёжность и предсказуемость результатов

Ограничения:

  • Возвращает только числовое представление
  • Для получения текстового названия требуется дополнительный код
  • Может потребоваться преобразование для совместимости с другими системами, где воскресенье считается первым днем недели (например, в американском формате)

Метод weekday() — это фундаментальный инструмент, который стоит использовать, когда требуется простой и быстрый способ получения дня недели, особенно если вам нужно числовое представление для дальнейших вычислений или сравнений. ⏱️

Использование calendar для определения дня недели в Python

Модуль calendar предоставляет альтернативный подход к определению дня недели по дате. Этот модуль изначально создан для работы с календарями, поэтому содержит функции, специфичные для календарных вычислений, включая определение дня недели.

Основная функция, которую мы будем использовать — weekday(year, month, day). Она принимает три аргумента: год, месяц и день, и возвращает день недели в виде числа от 0 до 6, где 0 — понедельник, а 6 — воскресенье (аналогично методу weekday() из модуля datetime).

Вот простой пример использования:

Python
Скопировать код
import calendar

# Определяем день недели для 15 октября 2023 года
year = 2023
month = 10
day = 15

weekday_number = calendar.weekday(year, month, day)
print(f"День недели для {year}-{month}-{day}: {weekday_number}")
# Вывод: День недели для 2023-10-15: 6

Как и в случае с datetime, для получения текстового представления дня недели можно использовать список названий:

Python
Скопировать код
import calendar

year = 2023
month = 10
day = 15

weekday_number = calendar.weekday(year, month, day)
weekdays = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"]

print(f"{year}-{month}-{day} — это {weekdays[weekday_number]}")
# Вывод: 2023-10-15 — это Воскресенье

Модуль calendar также предоставляет встроенные константы для дней недели, которые можно использовать для повышения читаемости кода:

Python
Скопировать код
import calendar

# Проверка, является ли 15 октября 2023 выходным днем
year = 2023
month = 10
day = 15

weekday_number = calendar.weekday(year, month, day)
is_weekend = weekday_number >= 5 # 5: Суббота, 6: Воскресенье

if is_weekend:
print(f"{year}-{month}-{day} — выходной день")
else:
print(f"{year}-{month}-{day} — рабочий день")
# Вывод: 2023-10-15 — выходной день

Существует также метод monthrange(year, month), который возвращает кортеж, содержащий день недели первого дня месяца и количество дней в месяце:

Python
Скопировать код
import calendar

year = 2023
month = 10

first_weekday, days_in_month = calendar.monthrange(year, month)
print(f"Первый день месяца {year}-{month} выпадает на день недели с номером: {first_weekday}")
print(f"Количество дней в месяце: {days_in_month}")
# Вывод: 
# Первый день месяца 2023-10 выпадает на день недели с номером: 6
# Количество дней в месяце: 31

Одно из преимуществ модуля calendar — возможность настройки начала недели:

Python
Скопировать код
import calendar

# По умолчанию первый день недели – понедельник (0)
calendar.setfirstweekday(calendar.SUNDAY) # Устанавливаем воскресенье как первый день недели

# Теперь при использовании функций модуля, воскресенье будет иметь индекс 0
weekday_number = calendar.weekday(2023, 10, 15)
print(f"День недели с настроенным первым днем недели: {weekday_number}")

Дмитрий Соколов, Data Scientist

Работая над проектом анализа финансовых данных для банка, я столкнулся с необходимостью классифицировать транзакции по дням недели. База содержала миллионы записей за несколько лет, и нам требовалось определить, в какие дни клиенты чаще всего совершают крупные покупки.

Изначально я использовал datetime.weekday(), но для оптимизации скорости обработки перешёл на функцию calendar.weekday(), которая работает напрямую с числовыми значениями года, месяца и дня без создания промежуточных объектов datetime. Это дало прирост производительности примерно на 15%.

Интересно, что результаты анализа показали чёткую закономерность: пятница была абсолютным лидером по крупным покупкам, за ней следовал понедельник. Банк использовал эти данные для настройки системы мониторинга подозрительной активности, так как транзакции в нетипичные дни с большей вероятностью могли оказаться мошенническими.

Функция Назначение Формат входных данных Формат результата
calendar.weekday(year, month, day) Получение дня недели по дате Три числа: год, месяц, день Число от 0 до 6 (пн-вс)
calendar.monthrange(year, month) Получение первого дня недели месяца и количества дней Два числа: год, месяц Кортеж (первый день, дней в месяце)
calendar.setfirstweekday(weekday) Установка первого дня недели Число от 0 до 6 None (изменяет глобальную настройку)
calendar.dayname[weekdaynumber] Получение названия дня недели Число от 0 до 6 Строка с названием дня (на английском)

Модуль calendar предоставляет эффективные инструменты для работы с днями недели, особенно когда требуется выполнять дополнительные календарные вычисления или когда данные уже представлены в виде отдельных компонентов года, месяца и дня. Это делает его отличным выбором для обработки структурированных данных или интеграции с внешними системами. 📅

Получение текстового названия дня недели через strftime()

Для многих приложений числовое представление дня недели недостаточно информативно. В этих случаях потребуется получить текстовое название дня недели, которое будет понятно пользователям. Метод strftime() (string format time) предоставляет мощный инструмент для форматирования объектов даты и времени в строковое представление, включая названия дней недели.

Метод strftime() доступен как для объектов datetime, так и для объектов date. Он принимает строку формата, в которой специальные директивы (начинающиеся с символа %) заменяются соответствующими значениями.

Для получения дня недели в текстовом формате используются следующие директивы:

  • %a – сокращенное название дня недели (например, "Пн", "Вт")
  • %A – полное название дня недели (например, "Понедельник", "Вторник")
  • %w – день недели как число (0-6, где 0 – воскресенье)
  • %u – день недели как число (1-7, где 1 – понедельник)

Рассмотрим примеры использования:

Python
Скопировать код
from datetime import datetime

# Создаем объект datetime для конкретной даты
date = datetime(2023, 10, 15)

# Получаем полное название дня недели
full_name = date.strftime("%A")
print(f"Полное название дня недели: {full_name}") # Вывод: Полное название дня недели: Sunday

# Получаем сокращенное название дня недели
short_name = date.strftime("%a")
print(f"Сокращенное название дня недели: {short_name}") # Вывод: Сокращенное название дня недели: Sun

# Получаем числовое представление (0-6, воскресенье – 0)
weekday_number = date.strftime("%w")
print(f"Числовое представление дня недели (0-6): {weekday_number}") # Вывод: Числовое представление дня недели (0-6): 0

# Получаем числовое представление (1-7, понедельник – 1)
iso_weekday = date.strftime("%u")
print(f"ISO числовое представление дня недели (1-7): {iso_weekday}") # Вывод: ISO числовое представление дня недели (1-7): 7

Обратите внимание, что названия дней недели выводятся на английском языке. Для получения локализованных названий на русском или другом языке необходимо использовать модуль locale:

Python
Скопировать код
import locale
from datetime import datetime

# Устанавливаем локаль для русского языка
locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8') # На Linux/MacOS
# Для Windows может потребоваться другой формат, например:
# locale.setlocale(locale.LC_TIME, 'Russian_Russia.1251')

date = datetime(2023, 10, 15)

# Теперь названия дней недели будут на русском
russian_full_name = date.strftime("%A")
russian_short_name = date.strftime("%a")

print(f"Полное название дня недели на русском: {russian_full_name}")
print(f"Сокращенное название дня недели на русском: {russian_short_name}")

Если установка локали не подходит для вашего приложения (например, требуется поддержка нескольких языков одновременно), можно создать собственные словари для перевода:

Python
Скопировать код
from datetime import datetime

# Словари для перевода дней недели
english_to_russian_full = {
"Monday": "Понедельник",
"Tuesday": "Вторник",
"Wednesday": "Среда",
"Thursday": "Четверг",
"Friday": "Пятница",
"Saturday": "Суббота",
"Sunday": "Воскресенье"
}

english_to_russian_short = {
"Mon": "Пн",
"Tue": "Вт",
"Wed": "Ср",
"Thu": "Чт",
"Fri": "Пт",
"Sat": "Сб",
"Sun": "Вс"
}

date = datetime(2023, 10, 15)

# Получаем английское название и преобразуем в русское
english_full_name = date.strftime("%A")
russian_full_name = english_to_russian_full.get(english_full_name, english_full_name)

english_short_name = date.strftime("%a")
russian_short_name = english_to_russian_short.get(english_short_name, english_short_name)

print(f"Полное название дня недели на русском: {russian_full_name}")
print(f"Сокращенное название дня недели на русском: {russian_short_name}")

Метод strftime() также позволяет создавать комплексные форматы, включающие день недели вместе с другой информацией о дате:

Python
Скопировать код
from datetime import datetime

date = datetime(2023, 10, 15)

# Создаем форматированную строку с днем недели и полной датой
formatted_date = date.strftime("%A, %d %B %Y")
print(formatted_date) # Вывод: Sunday, 15 October 2023

# Более компактный формат
compact_format = date.strftime("%a, %d/%m/%Y")
print(compact_format) # Вывод: Sun, 15/10/2023

Преимущества использования strftime() для получения дня недели:

  • Гибкость в форматировании и выводе информации
  • Возможность получения текстового представления дня недели
  • Встроенная поддержка локализации через модуль locale
  • Возможность комбинирования с другими элементами даты и времени

Ограничения:

  • Зависимость от настроек локали для корректного отображения не английских названий
  • Возможные проблемы с кодировками при работе в разных операционных системах
  • Немного более низкая производительность по сравнению с числовыми методами

Метод strftime() — идеальный выбор для случаев, когда требуется представление дня недели в удобочитаемом формате, особенно в пользовательском интерфейсе или отчетах. 🔤

Альтернативные библиотеки для работы с днями недели в Python

Помимо стандартных модулей datetime и calendar, существует ряд сторонних библиотек, которые могут значительно упростить работу с днями недели и предоставить дополнительные функциональные возможности. Рассмотрим наиболее популярные и полезные из них.

1. Pandas

Библиотека Pandas широко используется для анализа данных и предоставляет мощные инструменты для работы с временными рядами. Для определения дня недели по дате можно использовать функцию dt.day_name():

Python
Скопировать код
import pandas as pd

# Создаем Series с датами
dates = pd.Series(pd.date_range(start='2023-10-15', periods=7))

# Получаем названия дней недели
weekday_names = dates.dt.day_name()
print(weekday_names)
"""
Вывод:
0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
dtype: object
"""

# Для получения номера дня недели используем dt.weekday
weekday_numbers = dates.dt.weekday
print(weekday_numbers)
"""
Вывод:
0 6
1 0
2 1
3 2
4 3
5 4
6 5
dtype: int64
"""

Pandas также позволяет локализовать названия дней недели:

Python
Скопировать код
import pandas as pd
import locale

# Устанавливаем русскую локаль
locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')

dates = pd.Series(pd.date_range(start='2023-10-15', periods=7))
weekday_names_ru = dates.dt.day_name(locale='ru_RU.UTF-8')
print(weekday_names_ru)

2. Arrow

Arrow — библиотека, предоставляющая более дружественный и интуитивный API для работы с датами и временем, чем стандартный datetime:

Python
Скопировать код
import arrow

# Создаем объект Arrow для конкретной даты
date = arrow.get('2023-10-15')

# Получаем день недели как число (0-6, где 0 – понедельник)
weekday_number = date.weekday()
print(f"День недели: {weekday_number}") # Вывод: День недели: 6

# Форматируем дату для получения названия дня недели
weekday_name = date.format('dddd')
print(f"Название дня недели: {weekday_name}") # Вывод: Название дня недели: Sunday

# Arrow поддерживает локализацию
date_ru = arrow.get('2023-10-15').to('Europe/Moscow')
weekday_name_ru = date_ru.format('dddd', locale='ru')
print(f"Название дня недели на русском: {weekday_name_ru}")

3. Pendulum

Pendulum — современная альтернатива стандартной библиотеке datetime, с акцентом на удобство использования и выразительность:

Python
Скопировать код
import pendulum

# Создаем объект Pendulum для конкретной даты
date = pendulum.datetime(2023, 10, 15)

# Получаем день недели как число (0-6, где 0 – воскресенье, как в стандартном datetime.strftime('%w'))
weekday_number = date.day_of_week
print(f"День недели: {weekday_number}") # Вывод: День недели: 0 (воскресенье)

# Проверка на конкретный день недели
is_weekend = date.is_weekend()
print(f"Выходной день? {is_weekend}") # Вывод: Выходной день? True

# Получаем название дня недели
weekday_name = date.format('dddd')
print(f"Название дня недели: {weekday_name}") # Вывод: Название дня недели: Sunday

# Pendulum также поддерживает локализацию
date_ru = pendulum.datetime(2023, 10, 15, tz='Europe/Moscow')
weekday_name_ru = date_ru.format('dddd', locale='ru')
print(f"Название дня недели на русском: {weekday_name_ru}")

4. Maya

Maya — это гуманизированная библиотека для работы с датами, которая делает код более читаемым и интуитивно понятным:

Python
Скопировать код
import maya

# Создаем объект Maya для конкретной даты
date = maya.when('2023-10-15')

# Преобразуем в стандартный datetime для получения дня недели
dt = date.datetime()
weekday_number = dt.weekday()
print(f"День недели: {weekday_number}") # Вывод: День недели: 6

# Maya предоставляет удобные методы для форматирования
human_date = date.slang_date()
print(f"Человекочитаемая дата: {human_date}")

5. Delorean

Delorean — библиотека, вдохновлённая одноименной машиной времени, которая упрощает работу с датами и временными зонами:

Python
Скопировать код
from delorean import Delorean

# Создаем объект Delorean для конкретной даты
date = Delorean(datetime=datetime(2023, 10, 15))

# Получаем стандартный datetime объект
dt = date.datetime
weekday_number = dt.weekday()
print(f"День недели: {weekday_number}") # Вывод: День недели: 6

# Delorean также поддерживает "перемещение" во времени
next_day = date.next_day(1)
print(f"Следующий день: {next_day.datetime}")

Библиотека Простота использования Производительность Локализация Дополнительные возможности Популярность
datetime/calendar (стандартные) Средняя Высокая Через locale Базовые Встроенные
Pandas Высокая Средняя Встроенная Анализ временных рядов Очень высокая
Arrow Высокая Средняя Встроенная Удобный API, работа с временными зонами Высокая
Pendulum Очень высокая Средняя Встроенная Интуитивный API, проверки дней недели Средняя
Maya Высокая Низкая Ограниченная Человекочитаемые форматы Низкая
Delorean Средняя Средняя Через datetime "Путешествия" во времени Низкая

Выбор библиотеки зависит от конкретных требований вашего проекта:

  • Для анализа данных и работы с временными рядами оптимальным выбором будет Pandas
  • Для современной замены стандартной datetime с более удобным API подойдут Arrow или Pendulum
  • Для простых сценариев использования стандартные datetime и calendar вполне достаточны
  • Для проектов с акцентом на удобочитаемость и интуитивность можно рассмотреть Maya

Эти библиотеки существенно расширяют возможности Python для работы с днями недели, предоставляя более высокоуровневые абстракции и решая специфические задачи, которые могут быть сложными для реализации с использованием только стандартных библиотек. 🚀

Python предлагает богатый набор инструментов для работы с днями недели, от простых встроенных функций до мощных специализированных библиотек. Выбор оптимального метода зависит от специфики вашей задачи: нужна ли максимальная производительность, важна ли локализация, требуются ли дополнительные манипуляции с датами. Освоив эти инструменты, вы сможете элегантно решать широкий спектр задач — от простой классификации данных по дням недели до сложного временного анализа с учетом региональных особенностей. Главное помнить: правильно подобранный метод не только упрощает разработку, но и делает код более понятным и поддерживаемым.

Загрузка...