Airflow 气流:自定义日期:适用于datetime,但不适用于钟摆

Airflow 气流:自定义日期:适用于datetime,但不适用于钟摆,airflow,airflow-operator,Airflow,Airflow Operator,要求:创建用于运算符、DAG等的自定义日期函数 下面是DAG文件 DAG 来自气流导入DAG 从afflow.operators.python_operator导入PythonOperator 从datetime导入datetime,timedelta 从alerts.custom\u date导入strt\u of\u wk\u strt\u mon\u dt,NEXT\u DS\u NODASH 默认参数={ “所有者”:“气流”, “依赖于过去”:False, “开始日期”:日期时间(20

要求:创建用于运算符、DAG等的自定义日期函数

下面是DAG文件

DAG

来自气流导入DAG
从afflow.operators.python_operator导入PythonOperator
从datetime导入datetime,timedelta
从alerts.custom\u date导入strt\u of\u wk\u strt\u mon\u dt,NEXT\u DS\u NODASH
默认参数={
“所有者”:“气流”,
“依赖于过去”:False,
“开始日期”:日期时间(2020年7月8日),
“失败时发送电子邮件”:False,
“重试时发送电子邮件”:False,
“重试”:1,
“重试延迟”:时间增量(分钟=5),
}
dag=dag(dag\U id=‘测试日期’,
计划时间间隔=“@once”,
默认参数=默认参数)
def测试(**kwargs):
first\u date=kwargs.get('execution\u date',None)
strt_wk_dt=kwargs.get('strt_wk_dt')
next\u ds\u nodash=kwargs.get('next\u ds\u nodash')
s3\u key=kwargs.get('s3\u key'))
打印(f'执行日期:{first_DATE}')
打印(f'STRT_WK_DT:{STRT_WK_DT})
打印(f'NEXT_DS_NODASH:{NEXT_DS_NODASH})
打印(f的#u键:{s3_键}'))
对于dag:
执行日期=“{execution\u date}”
next_ds_nodash=next_ds_nodash
strt_wk_dt=strt_of w_strt_mon_dt()
t1=蟒蛇算子(
任务\u id='show_template',
python_callable=test,
op_kwargs={'execution_date':execution_date,
“下一个”:下一个,
“strt_wk_dt”:strt_wk_dt,
's3_key':f'snowflakes/FEEDS/{strt_wk_dt}/abc{strt_wk_dt}.csv'},
提供(上下文=真)
带有日期时间包 首先,我尝试使用DateTime库,效果很好,如下图所示

以下是cstm_date.py

从datetime导入datetime,timedelta
导入日志记录
logger=logging.getLogger(_名称__)
NEXT_DS_NODASH='{(执行日期+宏.timedelta(天=1)).strftime(“%m%d%Y”)}'
定义工作的时间(星期一):
return(datetime.today().date()-timedelta(days=datetime.today().weekday()).strftime(“%Y\u%m\u%d”)
输出正在按预期打印,如下所示

接下来,我尝试使用钟摆库,输出不是打印日期值 **摆式包装**

以下是cstm_date.py


进口摆
导入日志记录
logger=logging.getLogger(_名称__)
NEXT_DS_NODASH='{(执行日期+宏.timedelta(天=1)).strftime(“%m%d%Y”)}'
定义工作的时间(星期一):
今天=钟摆。现在()
今天返回。开始日期('week')。格式('YYYY\u MM\u DD'))
输出未打印
STRT\u WK\u DT


我缺少什么?

您正在为
datetime.strftime
使用正确的转换指令,但在使用
钟摆的新函数中未使用字符串
datetime
转换指令

你的
def strt_of_wk_strt_mon_dt():
今天=钟摆。现在()
今天返回。开始日期('week')。格式('YYYY\u MM\u DD'))
预定的
def strt_of_wk_strt_mon_dt():
今天=钟摆。现在()
今天返回。开始日期('week')。格式(“%Y\u%m\u%d”)

我定义了一个自定义日期函数。如何用作
{{strt\u of_wk\u strt\u mon\u dt}
,以便我可以在每个操作符或每个dag中使用。有两种方法可以做到这一点。首先,在操作符/任务实例的
params
arg的字典中传递它,并通过Jinja使用
{{params.strt\u of_wk\u strt\u mon\u dt}
在模板中调用它。第二,这是一个更大的问题,恐怕其中一个是我自己的问题。幸运的是,Mike Taylor,我是否应该打开一个新问题来获得第二个选项的答案?我导入了该函数,并尝试了以下
用户定义的\u宏={strt\u of w k\u strt\u mon\u dt':strt\u of w k\u strt\u mon\u dt}
,它不起作用。。然后我将其更改为
user_defined_macros={'strt_of_wk_strt_mon_dt':strt_of_wk_strt_mon_dt()}
,效果很好。。这里的问题是每次DAG解析它都会调用我不想调用的函数