You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Airflow DAG无法解析{{ ds }}模板变量,请求技术指导

问题原因

你遇到的错误核心是Airflow模板变量的渲染时机不对:

  • DAG文件加载时(Python代码解析阶段),{{ dag_run.logical_date|ds }}还只是原始的Jinja2模板字符串,没有被渲染成实际的日期字符串。
  • 此时datetime.strptime接收的参数是'{{dag_run.logical_date|ds}}',而非预期的YYYY-MM-DD格式日期,自然会抛出格式不匹配的错误。
解决方案

根据使用场景,有两种正确的处理方式:

1. 在支持模板的任务参数中直接用Jinja2处理

如果是在支持模板渲染的参数(比如BashOperator的bash_command、PythonOperator的op_args/op_kwargs等)里,直接用Jinja2语法处理日期,无需调用Python的strptime:

{{ (dag_run.logical_date - macros.timedelta(days=3)).strftime('%Y-%m-%d') }}

或者更简洁的写法,直接基于ds变量处理:

{{ (macros.datetime.strptime(ds, '%Y-%m-%d') - macros.timedelta(days=3)).strftime('%Y-%m-%d') }}

2. 在Python任务函数中直接操作datetime对象

如果是在Python任务里处理日期,不要在模板字符串里做解析,而是直接获取logical_date(本身就是datetime类型)进行计算:

使用Airflow 2.x的@task装饰器(推荐)

from airflow.decorators import dag, task
from datetime import datetime, timedelta
from airflow.utils.dates import days_ago

default_args = {
    'owner': 'airflow',
}

@dag(default_args=default_args, start_date=days_ago(1), schedule_interval='@daily')
def feature_store_daily():
    @task
    def calculate_three_days_ago(logical_date):
        # logical_date是datetime对象,直接计算
        three_days_ago = (logical_date - timedelta(days=3)).strftime('%Y-%m-%d')
        print(f"三天前的日期: {three_days_ago}")
        # 后续业务逻辑

    calculate_three_days_ago()

dag = feature_store_daily()

使用PythonOperator(旧版写法)

from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime, timedelta
from airflow.utils.dates import days_ago

default_args = {
    'owner': 'airflow',
}

def calculate_three_days_ago(**context):
    # 从上下文获取逻辑日期,已为datetime对象
    logical_date = context['logical_date']
    three_days_ago = (logical_date - timedelta(days=3)).strftime('%Y-%m-%d')
    print(f"三天前的日期: {three_days_ago}")

with DAG(
    'feature_store_daily',
    default_args=default_args,
    start_date=days_ago(1),
    schedule_interval='@daily',
) as dag:
    date_calculate_task = PythonOperator(
        task_id='calculate_three_days_ago',
        python_callable=calculate_three_days_ago,
        provide_context=True,  # 开启后传入上下文参数
    )
关键提醒
  • Airflow的模板变量仅在任务运行阶段被渲染,DAG解析阶段(文件加载时)不会处理模板字符串。
  • 尽量避免在Python代码的顶层逻辑中使用模板变量,应放在任务的模板参数或任务函数内部处理。

内容的提问来源于stack exchange,提问作者slysid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:22:26