【问题标题】:Airflow error with pandas: AttributeError: 'Pendulum' object has no attribute 'nanosecond'熊猫气流错误:AttributeError:'Pendulum'对象没有属性'nanosecond'
【发布时间】:2019-08-22 20:12:32
【问题描述】:

我有一个 pandas.DataFrame dfdf.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_dateAirflow macro execution_dateend_datenext_execution_date

我想问题与df 的日期时间dtypestart_dateend_date 的日期时间不兼容有关,但我不知道如何解决它。

我尝试删除时区,更改 dtype,但没有任何效果。

【问题讨论】:

    标签: python pandas airflow pendulum


    【解决方案1】:

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

    问题

    问题是由 Airflow 传递的两个宏引起的:

    • start_date,即execution_date

    • end_date,即next_execution_date

    正如 Airflow 文档所说,它们的类型是 pendulum.datetime,而不是 datetime.datetime。这会导致与pandas.DataFrame 发生冲突。

    pandaspendulum 目前不能很好地协同工作,问题在this StackOverflow asnwer 中有很好的描述。

    解决方案

    解决方案似乎是将start_dateend_datependulum.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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 2019-10-02
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      相关资源
      最近更新 更多