将气流宏 'ts' 转换为日期时间对象

Convert airflow macro 'ts' into datetime object

我在将气流宏引用 'ts' 转换为日期时间对象时遇到问题。问题出在字符串末尾的 tz

from datetime import datetime
timetoday = kwargs['ts']
t = datetime.strptime(timetoday, '%Y-%m-%dT%H:%M:%S%z')

代码没有成功执行,而是抛出一条错误消息:

time data '2019-08-24T00:00:00+00:00' does not match format '%Y-%m-%dT%H:%M:%S%z'

如果我使用格式略有不同的相同代码,并尝试使用 'ds' 宏,我设法将字符串转换为日期时间对象。

from datetime import datetime
timetoday = kwargs['ds']
t = datetime.strptime(timetoday, '%Y-%m-%d')

更新: 阅读 http://strftime.org/ 的注释并理解 %z 是形式为 的 UTC 偏移量+HHMM-HHMM(如果对象是天真的,则为空字符串)。 这让我想知道中间是否有额外的 ':' +00:00 (returned string of kwargs['ts'] 是错误的根本原因。但是,我仍然不确定如何正确解析它,因为 [=19] 中没有其他选项=].

因此,我将我的宏更改为 kwargs['ts_nodash'],它没有 return 时区,现在继续我的代码。如果有人知道该怎么做,我仍然有兴趣了解如何正确完成!谢谢!

timetoday = kwargs['ts_nodash']
t = datetime.strptime(timetoday, '%Y%m%dT%H%M%S')

查看 macros reference 和您的用例,我建议您使用 execution_date 宏而不是 ts

{{ ts }}            : same as execution_date.isoformat(). Example: 2018-01-01T00:00:00+00:00

{{ execution_date }}: the execution_date (pendulum.Pendulum)

如果您同意,这一切都归结为将 execution_datependulum object 转换为 Python datetime 对象,就像简单如 datetime.fromtimestamp(execution_date.timestamp())

Python 片段(转换)演示:

import pendulum
from pendulum import Pendulum
from datetime import datetime
..
execution_date: Pendulum = pendulum.now()
execution_date_as_datetime: datetime = datetime.fromtimestamp(execution_date.timestamp())

参考资料

  • execution_date jinja resolving as a string
  • How to convert pendulum to datetime.datetime type?

如果需要,您可以在您的 dag 中以简单的方式完成。

示例气流输出对象 {{ ts }} 来自 dag

2022-04-27T01:00:00+00:00

您的 dag 或脚本中的示例代码

from datetime import datetime as dt 
launch_dt = dt.fromisoformat(kwargs['ts'])
print(launch_dt)

2022-04-27 01:00:00+00:00