如何获取execution_date作为纪元时间?

时间:2019-04-17 05:46:16

标签: python jinja2 airflow

在常规的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

2 个答案:

答案 0 :(得分:1)

从Airflow 1.10开始,Airflow在日期时间使用Pendulum,该日期时间具有属性timestamp()int_timestampfloat_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

1。模板中的直接格式

此方法使用datetime对象的timestamp()方法生成一个浮点数,然后该浮点数通过Jinja2模板的内置int filter运行。

For Pendulum:
{{ execution_date.int_timestamp }}

For general datetime objects:
{{ execution_date.timestamp()|int }}

2。创建一个自定义的Jinja2过滤器

如果您在整个模板的多个位置使用此转换,则可能值得创建一个过滤器来集中此转换。使用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 }}