Ошибка воздушного потока с пандами: AttributeError: у объекта 'Pendulum' нет атрибута 'наносекунда'
У меня есть панды.DataFrame 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 ответ
После некоторых поисков я нашел источник проблемы и решение.
эта проблема
Проблема вызвана двумя макросами, передаваемыми из Airflow:
start_date
, какойexecution_date
макросend_date
, какойnext_execution_date
макрос
Типы их pendulum.datetime
, и не datetime.datetime
, как сказано в документации Airflow. Это вызывает конфликт с pandas.DataFrame
,
pandas
а также pendulum
в настоящее время не очень хорошо работают вместе, и проблема хорошо описана в этом ответе Stackru.
решение
Решение кажется, чтобы получить 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)