将气流宏 '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_date
(pendulum 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
我在将气流宏引用 '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_date
(pendulum 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