Python 熊猫气流错误:属性错误:';摆锤';对象没有属性';纳秒';

Python 熊猫气流错误:属性错误:';摆锤';对象没有属性';纳秒';,python,pandas,airflow,pendulum,Python,Pandas,Airflow,Pendulum,我有一个pandas.DataFramedf和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', '201

我有一个pandas.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[开始日期:结束日期]
,表示:

AttributeError: 'Pendulum' object has no attribute 'nanosecond'
如果不在中运行代码,我无法复制错误。同样的代码在没有气流的情况下运行良好

开始日期
执行日期
结束日期
下一个执行日期

我想问题在于
df
的日期时间
dtype
开始日期
结束日期
的日期时间不兼容,但我不知道如何解决这个问题


我尝试删除时区,更改
数据类型,但没有任何效果。

经过一些搜索,我找到了问题的根源和解决方案

问题

该问题是由气流传递的两个宏引起的:

  • 开始日期
    ,它是执行日期

  • 结束日期
    ,它是下一个执行日期宏

  • 它们的类型是
    be摆.datetime
    ,而不是
    datetime.datetime
    ,正如气流文档所说。这会导致与
    pandas.DataFrame
    冲突

    pandas
    be摆
    目前不能很好地协同工作,问题在StackOverflow asnwer中得到了很好的描述

    解决方案

    解决方案是将
    开始日期
    结束日期
    钟摆日期时间
    转换为
    日期时间

    为此,我创建了这个简单的函数,它将从转换为字符串beof,或者转换为
    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)