Pandas & NumPy Academy · Урок

Корректный разбор дат

Преобразуйте строки с датами в datetime64 с помощью pd.to_datetime, обрабатывайте несколько форматов и задавайте DatetimeIndex.

Урок 4 из 413 шагов

«Корректный разбор дат» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Почему важно правильно разбирать даты

Данные о датах и времени повсеместно встречаются в реальных наборах данных: временные метки транзакций, даты рождения, журналы событий и финансовые периоды. Когда даты хранятся как строки (тип object), Вы не можете вычислять длительности, изменять частоту данных по месяцам или сортировать их в хронологическом порядке. Преобразование строк в тип Pandas datetime64 открывает доступ ко всему API временных рядов и делает возможным анализ временных данных.

import pandas as pd

df = pd.DataFrame({'date': ['2024-01-15', '2024-03-20', '2024-07-04']})
print(df['date'].dtype)  # object

# You cannot do arithmetic on string dates
# df['date'] + pd.Timedelta('1 day')  # TypeError!

# After parsing:
df['date'] = pd.to_datetime(df['date'])
print(df['date'].dtype)        # datetime64[ns]
print(df['date'] + pd.Timedelta('1 day'))

Основы pd.to_datetime()

pd.to_datetime(series) — основная функция для преобразования строковых столбцов в datetime64. Она умеет автоматически распознавать большинство распространённых форматов дат (ISO 8601, американский и европейский форматы) без явного указания строки формата. В результате получается Series с типом данных datetime64[ns] — наносекундной точностью и возможностью хранить временные метки с 1677 по 2262 год.

import pandas as pd

dates = pd.Series([
    '2024-01-15',
    '15/01/2024',
    'January 15, 2024',
    '2024-01-15 08:30:00'
])

parsed = pd.to_datetime(dates)
print(parsed)
# 0   2024-01-15 00:00:00
# 1   2024-01-15 00:00:00
# 2   2024-01-15 00:00:00
# 3   2024-01-15 08:30:00
print(parsed.dtype)  # datetime64[ns]

Указание аргумента format=

Если автоматическое определение формата работает слишком медленно или даёт неоднозначный результат (например, '01-02-03' может означать 2 января 2003 года, 1 февраля 2003 года или 3 февраля 2001 года), укажите точную строку формата, используя коды Python strftime. Это также значительно быстрее: на больших наборах данных явный разбор формата может быть в 10 раз быстрее автоматического, поскольку Pandas не приходится проверять несколько шаблонов.

import pandas as pd

dates = pd.Series(['15/01/2024', '20/03/2024', '04/07/2024'])

# Explicit format: day/month/year
parsed = pd.to_datetime(dates, format='%d/%m/%Y')
print(parsed)
# 0   2024-01-15
# 1   2024-03-20
# 2   2024-07-04

# Common format codes:
# %Y = 4-digit year, %y = 2-digit year
# %m = month (01-12), %d = day (01-31)
# %H = hour (0-23), %M = minute, %S = second

errors='coerce' для некорректных дат

В реальных наборах данных в столбцах с датами часто встречаются опечатки или строки-заполнители, например 'TBD', 'N/A' или '99/99/9999'. Передача errors='coerce' указывает pd.to_datetime() преобразовывать значения, которые невозможно разобрать, в NaT (Not a Time — аналог NaN для даты и времени), вместо того чтобы вызывать исключение. Это позволяет отдельно находить и обрабатывать некорректные даты.

import pandas as pd

dates = pd.Series(['2024-01-15', 'TBD', '2024-07-04', 'N/A'])

parsed = pd.to_datetime(dates, errors='coerce')
print(parsed)
# 0   2024-01-15
# 1          NaT
# 2   2024-07-04
# 3          NaT

# Detect bad dates
print('Bad date rows:', parsed.isna().sum())  # 2

parse_dates в read_csv()

Эффективнее всего разбирать даты во время загрузки, используя параметр parse_dates функции pd.read_csv(). Передайте список имён столбцов (или их индексов), которые следует разобрать как даты. Это избавляет от отдельного этапа постобработки и часто работает быстрее, поскольку Pandas выполняет преобразование во время разбора CSV на уровне C.

import pandas as pd
import io

csv_data = '''order_id,order_date,ship_date
1,2024-01-15,2024-01-18
2,2024-02-20,2024-02-22
'''

df = pd.read_csv(
    io.StringIO(csv_data),
    parse_dates=['order_date', 'ship_date']
)
print(df.dtypes)
# order_id      int64
# order_date    datetime64[ns]
# ship_date     datetime64[ns]

Аксессор .dt для компонентов даты

После того как столбец получил тип datetime64, аксессор .dt открывает доступ к десяткам свойств и методов. Вы можете извлекать .dt.year, .dt.month, .dt.day, .dt.hour, .dt.dayofweek (0 = понедельник) и .dt.is_month_end. Они используются для создания признаков при прогнозировании временных рядов и для группировки данных по периодам времени.

import pandas as pd

df = pd.DataFrame({
    'event_time': pd.to_datetime([
        '2024-03-15 08:30:00',
        '2024-07-04 14:00:00',
        '2024-12-25 09:00:00'
    ])
})

df['year'] = df['event_time'].dt.year
df['month'] = df['event_time'].dt.month
df['day_of_week'] = df['event_time'].dt.day_name()
df['hour'] = df['event_time'].dt.hour
print(df[['year', 'month', 'day_of_week', 'hour']])

Установка DatetimeIndex

При анализе временных рядов обычно столбец с датами назначают индексом DataFrame. С DatetimeIndex Вы можете выполнять выборку по времени (df['2024'], df['2024-01':'2024-06']), изменять частоту данных на любую и пользоваться всем API временных рядов Pandas. Используйте set_index() или передайте index_col в read_csv.

import pandas as pd

df = pd.DataFrame({
    'date': pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03']),
    'temp': [22.5, 23.0, 21.8]
})

df = df.set_index('date')
print(df)
#             temp
# date
# 2024-01-01  22.5
# 2024-01-02  23.0
# 2024-01-03  21.8

# Time-based slicing
print(df['2024-01-02':'2024-01-03'])

Обработка нескольких форматов дат

Если столбец с датами содержит смешанные форматы (например, в одних строках даты записаны в формате ISO, а в других — в американском формате), нельзя указать одну строку формата. Передайте format='mixed' (в Pandas 2.0 и новее), чтобы включить определение формата для каждой строки, или предварительно очистите столбец с помощью регулярного выражения, приведя все даты к одному формату перед вызовом pd.to_datetime().

import pandas as pd

mixed_dates = pd.Series([
    '2024-01-15',
    '03/20/2024',
    '2024-07-04T10:30:00'
])

# format='mixed' handles different formats row-by-row (Pandas >= 2.0)
parsed = pd.to_datetime(mixed_dates, format='mixed')
print(parsed)
# 0   2024-01-15 00:00:00
# 1   2024-03-20 00:00:00
# 2   2024-07-04 10:30:00

Дата и время с часовым поясом

Временные метки из реальных данных часто содержат сведения о часовом поясе. pd.to_datetime() умеет разбирать строки со смещением относительно UTC (например, '2024-01-15 08:30:00+05:30') и сохранять их как datetime64 с часовым поясом. Используйте .dt.tz_convert('UTC'), чтобы привести все временные метки к единому часовому поясу для корректного сравнения и выполнения арифметических операций.

import pandas as pd

dates = pd.to_datetime(['2024-01-15 08:30:00+05:30', '2024-01-15 10:00:00-08:00'])
print(dates)
# DatetimeIndex(['2024-01-15 08:30:00+05:30', '2024-01-15 10:00:00-08:00'])

# Convert both to UTC for fair comparison
utc_dates = dates.tz_convert('UTC')
print(utc_dates)
# DatetimeIndex(['2024-01-15 03:00:00+00:00', '2024-01-15 18:00:00+00:00'])

Вычисление разностей между датами

Арифметические операции над двумя столбцами datetime64 создают Series типа Timedelta. Извлечь количество дней, часов или секунд из Timedelta можно с помощью свойств .dt.days, .dt.seconds и .dt.total_seconds(). Это стандартный способ вычислять возраст, длительность или признаки вроде количества дней с момента последнего события.

import pandas as pd

df = pd.DataFrame({
    'start': pd.to_datetime(['2024-01-01', '2024-03-10', '2024-06-15']),
    'end': pd.to_datetime(['2024-01-20', '2024-04-05', '2024-06-30'])
})

df['duration_days'] = (df['end'] - df['start']).dt.days
print(df[['start', 'end', 'duration_days']])
#        start        end  duration_days
# 0 2024-01-01 2024-01-20             19
# 1 2024-03-10 2024-04-05             26
# 2 2024-06-15 2024-06-30             15

pd.date_range() для создания дат

pd.date_range(start, end, freq=) создаёт последовательность равномерно расположенных дат в виде DatetimeIndex. Это удобно для создания полной временной шкалы, с которой можно сопоставить данные с помощью повторной индексации, — так в результате будет представлен каждый календарный период, даже если в этот день не было событий. Распространённые значения freq: 'D' (ежедневно), 'ME' (конец месяца), 'h' (ежечасно).

import pandas as pd

# Weekly dates for the first quarter of 2024
weekly = pd.date_range(start='2024-01-01', end='2024-03-31', freq='W')
print(weekly[:5])
# DatetimeIndex(['2024-01-07', '2024-01-14', '2024-01-21', '2024-01-28', '2024-02-04'])

# Monthly date spine
monthly = pd.date_range(start='2024-01', periods=12, freq='ME')
print(len(monthly), monthly[0], monthly[-1])
# 12 2024-01-31 2024-12-31

Быстрая проверка

Проверьте, насколько хорошо Вы поняли правильный разбор дат в Pandas.

Итоги урока

В этом уроке Вы узнали: pd.to_datetime() преобразует строковые столбцы в datetime64, format= задаёт точный шаблон для повышения скорости и точности, а errors='coerce' преобразует некорректные даты в NaT вместо аварийного завершения программы. Аксессор .dt извлекает год, месяц, день и другие компоненты, а установка DatetimeIndex позволяет выполнять выборку по времени. Далее Вы изучите аксессор .str для векторизованных операций над строками.

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Корректный разбор дат» бесплатный?

Да — полный текст урока «Корректный разбор дат» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Корректный разбор дат»?

Преобразуйте строки с датами в datetime64 с помощью pd.to_datetime, обрабатывайте несколько форматов и задавайте DatetimeIndex. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Корректный разбор дат»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Проверка типов данных столбцов
  2. Приведение типов с помощью astype()
  3. Категориальный тип данных
  4. Корректный разбор дат
← Назад к Pandas & NumPy Academy