5 способов определить день недели по дате в Python: готовые методы
Для кого эта статья:
- 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, но может отличаться от локальных конвенций в некоторых странах.
Рассмотрим базовый пример использования:
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
Если вам нужно работать с текущей датой, код упрощается:
from datetime import datetime
# Получаем текущую дату и время
now = datetime.now()
# Получаем день недели
weekday_number = now.weekday()
print(f"Сегодня день недели с номером: {weekday_number}")
Для преобразования числового представления в понятное название дня недели можно использовать список:
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 (воскресенье), что может быть более интуитивно для некоторых пользователей:
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).
Вот простой пример использования:
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, для получения текстового представления дня недели можно использовать список названий:
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 также предоставляет встроенные константы для дней недели, которые можно использовать для повышения читаемости кода:
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), который возвращает кортеж, содержащий день недели первого дня месяца и количество дней в месяце:
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 — возможность настройки начала недели:
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 – понедельник)
Рассмотрим примеры использования:
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:
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}")
Если установка локали не подходит для вашего приложения (например, требуется поддержка нескольких языков одновременно), можно создать собственные словари для перевода:
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() также позволяет создавать комплексные форматы, включающие день недели вместе с другой информацией о дате:
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():
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 также позволяет локализовать названия дней недели:
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:
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, с акцентом на удобство использования и выразительность:
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 — это гуманизированная библиотека для работы с датами, которая делает код более читаемым и интуитивно понятным:
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 — библиотека, вдохновлённая одноименной машиной времени, которая упрощает работу с датами и временными зонами:
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 предлагает богатый набор инструментов для работы с днями недели, от простых встроенных функций до мощных специализированных библиотек. Выбор оптимального метода зависит от специфики вашей задачи: нужна ли максимальная производительность, важна ли локализация, требуются ли дополнительные манипуляции с датами. Освоив эти инструменты, вы сможете элегантно решать широкий спектр задач — от простой классификации данных по дням недели до сложного временного анализа с учетом региональных особенностей. Главное помнить: правильно подобранный метод не только упрощает разработку, но и делает код более понятным и поддерживаемым.