2025, Sep 29 01:15
NaT в pandas: объяснение и примеры для datetime и timedelta
Разбираем NaT в pandas: что означает Not a Time, почему появляется в столбцах datetime и timedelta, как воспринимать его как пропуск и работать с данными.
Увидеть NaT в столбце datetime в pandas поначалу может быть непривычно. Кажется, что это особое значение — так и есть: NaT расшифровывается как “Not a Time”. Это аналог NaN для типов datetime и timedelta, и он появляется, когда отсутствует «временное» значение.
Пример кода: где появляется NaT
В следующем DataFrame есть «датоподобный» столбец с пропуском. Этот пропуск представлен как NaT.
import pandas as pd
work_items = pd.DataFrame({
    "asset": ["windows", "doors", "hvac"],
    "state": ["done", "done", "delayed"],
    "finished_on": [
        pd.Timestamp("2025-08-20"),
        pd.Timestamp("2025-08-21"),
        pd.NaT,
    ],
})
print(work_items)
Вывод:
     asset    state finished_on
0  windows     done  2025-08-20
1    doors     done  2025-08-21
2     hvac  delayed        NaT
Что означает NaT и почему он возникает
NaT означает “Not a Time”. Это маркер пропущенного значения для данных типов datetime и timedelta — по аналогии с тем, как NaN обозначает отсутствие числовых данных. Вы увидите его в столбцах datetime и timedelta там, где нет значения.
Официальная справка по pandas.NaT сейчас может показаться мало полезной («alias of NaT») из‑за известной проблемы в Pandas 2.2+. Пока это не исправлено, чёткое определение приведено в руководствах по пропущенным значениям.
NaT — это пропущенное значение для данных типов timedelta и datetime (см. ниже):
NaT: (N)ot-(A)-(T)ime, временной эквивалент NaN.
Пользовательское руководство также описывает, какие служебные значения pandas использует для разных dtypes, включая NaT для «датоподобных» типов.
Работа с пропущенными данными
Значения, считающиеся «пропущенными»
pandas использует разные служебные значения для представления пропуска (также называемого NA) в зависимости от типа данных. [...]
NaTдля NumPynp.datetime64,np.timedelta64иPeriodDtype.
Похоже, что в Pandas 2.2+ есть и ошибка в документации, из‑за которой страница справки pandas.NaT содержит лаконичную фразу «alias of NaT». Обсуждение отслеживается здесь: DOC: NaT - 'alias of NaT'; NA - 'alias of <NA>'. Для краткого локального пояснения интерактивная справка формулирует это так:
In [5]: ?pd.NaT
Type:        NaTType
String form: NaT
File:        .../pandas/_libs/tslibs/nattype.cpython-311-x86_64-linux-gnu.so
Docstring:  
(N)ot-(A)-(T)ime, the time equivalent of NaN.
Examples
--------
>>> pd.DataFrame([pd.Timestamp("2023"), np.nan], columns=["col_1"])
        col_1
0  2023-01-01
1         NaT
Решение: воспринимайте NaT как маркер пропуска для временных данных
Важно понимать: NaT — это назначенный маркер отсутствующих значений для «временных» типов в pandas. Это не ошибка и не строка; это стандартная заглушка для недостающего значения datetime или timedelta. Следующий минимальный пример из справки показывает, как сочетание метки времени и пропуска отображается как NaT в «датоподобном» столбце:
import pandas as pd
import numpy as np
minimal = pd.DataFrame([pd.Timestamp("2023"), np.nan], columns=["col_dt"])
print(minimal)
Вывод:
        col_dt
0  2023-01-01
1         NaT
Почему это важно
Во временных рядах и событиях нередко встречаются неполные метки времени. Воспринимая NaT как «пропущенное время», проще понять, почему у некоторых записей нет даты или длительности, и корректно рассуждать о столбцах datetime и timedelta, не принимая эти маркеры за обычные строки или числа.
Вывод
NaT — это просто «Not a Time», временной эквивалент NaN. Вы будете встречать его в данных pandas с типами datetime и timedelta всякий раз, когда значение отсутствует. За точными формулировками и контекстом обращайтесь к страницам pandas о пропущенных значениях и к разделу руководства о значениях, считающихся пропущенными, либо откройте интерактивную справку по pd.NaT.