在常规的python代码中,我可以这样做:
import time
int(time.time())
这给了我时间。
我希望能够使用气流宏:execution_date
这是我尝试过的:
"{{ strptime(execution_date.strftime('%Y-%m-%d %H:%M:%S'), '%d.%m.%Y %H:%M:%S') }}"
但这给出了:
jinja2.exceptions.UndefinedError:'strptime'未定义
我正在运行Airflow 1.9和Python 2.7
答案 0 :(得分:1)
从Airflow 1.10开始,Airflow在日期时间使用Pendulum,该日期时间具有属性timestamp()
,int_timestamp
和float_timestamp
,返回时期。
因此,您可以这样做:
{{ execution_date.int_timestamp }}
文档:https://pendulum.eustace.io/docs/#attributes-and-properties
其他选项是:
{{ execution_date.strftime('%s') }} # Also Python 2
{{ execution_date.timestamp() }} # Python >=3.3
答案 1 :(得分:1)
有几种解决方法,但是首先,您应该简化访问时间戳的方式。
在使用Airflow(执行日期为pendulum.Pendulum对象)时,您可以访问execution_date.int_timestamp属性。
在更一般的情况下,假设您使用的是Python 3.3+,则有一种更简单的方法,可以在日期时间对象上使用timestamp()方法获取纪元时间戳(在Pendulum对象上也可用)。
execution_date.int_timestamp
Output => 1555477775
Python 3.3+:
int(execution_date.timestamp())
Output => 1555477775
Python 2.7+:
int(v.strftime('%s'))
Output => 1555477775
此方法使用datetime对象的timestamp()方法生成一个浮点数,然后该浮点数通过Jinja2模板的内置int filter运行。
For Pendulum:
{{ execution_date.int_timestamp }}
For general datetime objects:
{{ execution_date.timestamp()|int }}
如果您在整个模板的多个位置使用此转换,则可能值得创建一个过滤器来集中此转换。使用Airflow,您可以register a custom filter在DAG对象上。
import time
def epoch_int(v):
return int(v.strftime('%s'))
dag = DAG(
...
user_defined_filters={
"epoch_int": epoch_int,
}
...
)
,然后在模板中使用它。
{{ execution_date|epoch_int }}