Pandas – это мощный инструмент для анализа данных на Python, и он предоставляет широкие возможности для работы с датами и временем. Одной из распространенных задач является определение даты начала недели для конкретной даты. Эта статья раскроет секреты того, как Pandas позволяет мгновенно решать эту задачу, предоставив вам необходимые знания и примеры кода.
Определение начала недели: основные подходы в Pandas
В Pandas существует несколько способов определить дату начала недели. Рассмотрим два основных подхода:
Использование dt.isocalendar().week для определения номера недели и вычисления даты начала
Этот метод основан на стандарте ISO 8601, где неделя начинается с понедельника. Мы можем использовать dt.isocalendar().week для получения номера недели в году, а затем вычислить дату начала недели, исходя из номера года и дня года.
import pandas as pd
date = pd.Timestamp('2025-10-27')
week_number = date.isocalendar().week
year = date.isocalendar().year
first_day_of_week = pd.to_datetime(f'{year}-W{int(week_number)}-1', format='%Y-W%W-%w')
print(first_day_of_week)
Преобразование в период недели с помощью dt.to_period('W')
Функция dt.to_period('W') преобразует Timestamp в период, представляющий неделю. Затем можно получить дату начала этого периода.
import pandas as pd
date = pd.Timestamp('2025-10-27')
week_start = date.to_period('W').start_time
print(week_start)
Получение даты начала недели для конкретной даты
Рассмотрим подробнее, как получить дату начала недели для конкретной даты, учитывая различные сценарии.
Преобразование строки в Timestamp и вычисление начала недели
Если дата представлена в виде строки, сначала необходимо преобразовать ее в Timestamp.
import pandas as pd
date_string = '2025-10-27'
date = pd.to_datetime(date_string)
week_start = date.to_period('W').start_time
print(week_start)
Учет различных дней начала недели (понедельник vs. воскресенье)
По умолчанию, dt.to_period('W').start_time считает началом недели понедельник. Если вам нужно, чтобы неделя начиналась с воскресенья, можно использовать dt.strftime('%w') для определения дня недели и смещения даты.
import pandas as pd
def get_week_start(date, start_day='monday'):
date = pd.to_datetime(date)
if start_day == 'monday':
return date.to_period('W').start_time
elif start_day == 'sunday':
day_of_week = int(date.strftime('%w')) # Sunday is 0, Monday is 1, etc.
return date - pd.Timedelta(days=day_of_week)
else:
raise ValueError("start_day must be 'monday' or 'sunday'")
print(get_week_start('2025-10-27', start_day='sunday'))
print(get_week_start('2025-10-27', start_day='monday'))
Работа с серией дат: применение к столбцу DataFrame
Pandas позволяет эффективно работать с серией дат в столбце DataFrame.
Векторизованные операции для эффективного вычисления начала недели для целого столбца
Векторизованные операции позволяют применять функцию к каждому элементу столбца без использования циклов, что значительно повышает производительность.
import pandas as pd
data = {'date': ['2025-10-27', '2025-10-28', '2025-10-29']}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
df['week_start'] = df['date'].dt.to_period('W').dt.start_time
print(df)
Обработка ошибок и пропущенных значений (NaT) при вычислении начала недели
При работе с реальными данными необходимо учитывать возможность наличия пропущенных значений (NaT — Not a Time). Pandas предоставляет инструменты для обработки таких случаев.
import pandas as pd
import numpy as np
data = {'date': ['2025-10-27', np.nan, '2025-10-29']}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
df['week_start'] = df['date'].dt.to_period('W').dt.start_time
print(df)
В данном примере, строка с np.nan в столбце ‘date’ приведет к NaT в столбце ‘week_start’. Вы можете использовать .fillna() или .dropna() для обработки этих значений.
Расширенные возможности: временные зоны и локализация
Учет временных зон при определении начала недели
При работе с данными, охватывающими разные временные зоны, необходимо учитывать этот фактор при определении начала недели. Pandas позволяет указывать временную зону при создании Timestamp.
import pandas as pd
import pytz
timezone = pytz.timezone('Europe/Moscow')
date = pd.Timestamp('2025-10-27', tz=timezone)
week_start = date.to_period('W').start_time
print(week_start)
Локализация и форматирование даты начала недели для различных регионов
Форматирование даты начала недели может быть адаптировано для различных регионов с использованием strftime.
import pandas as pd
import locale
locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8') # Setting locale to Russian
date = pd.Timestamp('2025-10-27')
week_start = date.to_period('W').start_time
formatted_date = week_start.strftime('%A, %d %B %Y')
print(formatted_date)
Заключение
В этой статье мы рассмотрели различные способы определения даты начала недели с использованием библиотеки Pandas. Вы узнали, как использовать функции dt.isocalendar().week и dt.to_period('W'), как учитывать различные дни начала недели, как работать с серией дат в DataFrame и как обрабатывать ошибки и пропущенные значения. Также мы затронули расширенные возможности, такие как учет временных зон и локализация даты начала недели. Эти знания помогут вам эффективно анализировать и обрабатывать данные о времени в ваших проектах.