Ошибка воздушного потока с пандами: AttributeError: у объекта 'Pendulum' нет атрибута 'наносекунда' - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть панда. Рамка данных df с df.index, которая выдает что-то вроде этого:

DatetimeIndex(['2014-10-06 00:55:11.357899904',
               '2014-10-06 00:56:39.046799898',
               '2014-10-06 00:56:39.057499886',
               '2014-10-06 00:56:40.684299946',
               '2014-10-06 00:56:41.115299940',
               '2014-10-06 01:03:52.764300108',
               '2014-10-06 01:21:18.448499918',
               '2014-10-06 01:21:18.457200050',
               '2014-10-06 01:21:18.584199905',
               '2014-10-06 01:21:18.594700098',
               ...
               '2014-11-05 00:25:47.996000051',
               '2014-11-05 00:56:45.081799984',
               '2014-11-05 00:56:45.096899986',
               '2014-11-05 05:50:57.639699936',
               '2014-11-05 06:08:56.365000010',
               '2014-11-05 06:11:20.519099950',
               '2014-11-05 06:15:03.470400095',
               '2014-11-05 06:15:03.981600046',
               '2014-11-05 06:25:31.514300108',
               '2014-11-05 06:25:59.310400009'],
              dtype='datetime64[ns]', name='time', length=1000, freq=None)

Я запускаю DAG для потока воздуха, который останавливается на следующей строке df.loc[start_date:end_date], говоря, что:

AttributeError: 'Pendulum' object has no attribute 'nanosecond'

Я не могу воспроизвести ошибку, не запустив код в Airflow. Тот же код прекрасно работает без Airflow.

start_date - это макрос Airflow execution_date, а end_date - это next_execution_date.

Полагаю, проблема в том, что дата-время dtype из df не совместимо с данными из start_date & end_date, но я понятия не имею, как их решить.

Я пытался удалить часовые пояса, изменить dtype, но ничего не получалось.

1 Ответ

0 голосов
/ 01 апреля 2019

После некоторых поисков я нашел источник проблемы и решение.

проблема

Проблема вызвана двумя макросами, переданными из Airflow:

  • start_date, то есть макрос execution_date

  • end_date, то есть макрос next_execution_date

Типы их pendulum.datetime, а не datetime.datetime, как говорится в документации Airflow. Это вызывает конфликт с pandas.DataFrame.

pandas и pendulum в настоящее время плохо работают вместе, и проблема хорошо описана в этом ответе StackOverflow.

решение

Похоже, что решение позволяет преобразовать start_date и end_date из pendulum.datetime в datetime.datetime.

Для этого я создал эту простую функцию, которая преобразует из строки до преобразования в datetime.datetime. Я уверен, что это лучший способ сделать это, но это было довольно просто и безопасно, поэтому я и использовал его.

Вот сама функция:

def pendulum_to_datetime(pendulum_date):
    """
    Convert pendulum to datetime format.

    The conversion is done from pendulum -> string -> dateime.

    Args:
        pendulum_date (pendulum): The date you wish to convert.

    Returns:
        (datetime) The converted date.
    """
    fmt = '%Y-%m-%dT%H:%M:%S%z'
    string_date = pendulum_date.strftime(fmt)
    return datetime.strptime(string_date, fmt)
...