Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!

airflow.timetables.simple

Attributes

BaseAsset

log

DEFAULT_PARTITION_MAPPER

Classes

NullTimetable

Timetable that never schedules anything.

OnceTimetable

Timetable that schedules the execution once as soon as possible.

ContinuousTimetable

Timetable that schedules continually, while still respecting start_date and end_date.

PartitionedAtRuntime

Timetable that never schedules anything; partition keys are set at runtime.

PartitionedAssetTimetable

Asset-driven timetable that listens for partitioned assets.

Module Contents

type airflow.timetables.simple.BaseAsset = SerializedAssetBase[source]
airflow.timetables.simple.log[source]
class airflow.timetables.simple.NullTimetable[source]

Bases: _TrivialTimetable

Timetable that never schedules anything.

This corresponds to schedule=None.

can_be_scheduled = False[source]

Whether this timetable can actually schedule runs in an automated manner.

This defaults to and should generally be True (including non periodic execution types like @once and data triggered tables), but NullTimetable sets this to False.

partitioned_at_runtime = False[source]

Whether this timetable defers partition selection to task runtime.

True for PartitionedAtRuntime; downstream code can branch on this flag instead of using isinstance.

description: str = 'Never, external triggers only'[source]

Human-readable description of the timetable.

For example, this can produce something like 'At 21:30, only on Friday' from the cron expression '30 21 * * 5'. This is used in the webserver UI.

property summary: str[source]

A short summary for the timetable.

This is used to display the timetable in the web UI. A cron expression timetable, for example, can use this to display the expression. The default implementation returns the timetable’s type name.

next_dagrun_info(*, last_automated_data_interval, restriction)[source]

Provide information to schedule the next DagRun.

The default implementation raises NotImplementedError.

Parameters:
  • last_automated_data_interval (airflow.timetables.base.DataInterval | None) – The data interval of the associated DAG’s last scheduled or backfilled run (manual runs not considered). This is only None when the Dag is being scheduled for the first time, which happens when the Dag processor first parses the Dag – before any Dag run exists.

  • restriction (airflow.timetables.base.TimeRestriction) – Restriction to apply when scheduling the DAG run. See documentation of TimeRestriction for details.

Returns:

Information on when the next DagRun can be scheduled. None means a DagRun will not happen. This does not mean no more runs will be scheduled even again for this DAG; the timetable can return a DagRunInfo object when asked at another time.

Return type:

airflow.timetables.base.DagRunInfo | None

class airflow.timetables.simple.OnceTimetable[source]

Bases: _TrivialTimetable

Timetable that schedules the execution once as soon as possible.

This corresponds to schedule="@once".

description: str = 'Once, as soon as possible'[source]

Human-readable description of the timetable.

For example, this can produce something like 'At 21:30, only on Friday' from the cron expression '30 21 * * 5'. This is used in the webserver UI.

property summary: str[source]

A short summary for the timetable.

This is used to display the timetable in the web UI. A cron expression timetable, for example, can use this to display the expression. The default implementation returns the timetable’s type name.

next_dagrun_info(*, last_automated_data_interval, restriction)[source]

Provide information to schedule the next DagRun.

The default implementation raises NotImplementedError.

Parameters:
  • last_automated_data_interval (airflow.timetables.base.DataInterval | None) – The data interval of the associated DAG’s last scheduled or backfilled run (manual runs not considered). This is only None when the Dag is being scheduled for the first time, which happens when the Dag processor first parses the Dag – before any Dag run exists.

  • restriction (airflow.timetables.base.TimeRestriction) – Restriction to apply when scheduling the DAG run. See documentation of TimeRestriction for details.

Returns:

Information on when the next DagRun can be scheduled. None means a DagRun will not happen. This does not mean no more runs will be scheduled even again for this DAG; the timetable can return a DagRunInfo object when asked at another time.

Return type:

airflow.timetables.base.DagRunInfo | None

class airflow.timetables.simple.ContinuousTimetable[source]

Bases: _TrivialTimetable

Timetable that schedules continually, while still respecting start_date and end_date.

This corresponds to schedule="@continuous".

description: str = 'As frequently as possible, but only one run at a time.'[source]

Human-readable description of the timetable.

For example, this can produce something like 'At 21:30, only on Friday' from the cron expression '30 21 * * 5'. This is used in the webserver UI.

active_runs_limit = 1[source]

Maximum active runs that can be active at one time for a DAG.

This is called during DAG initialization, and the return value is used as the DAG’s default max_active_runs. This should generally return None, but there are good reasons to limit DAG run parallelism in some cases, such as for ContinuousTimetable.

property summary: str[source]

A short summary for the timetable.

This is used to display the timetable in the web UI. A cron expression timetable, for example, can use this to display the expression. The default implementation returns the timetable’s type name.

next_dagrun_info(*, last_automated_data_interval, restriction)[source]

Provide information to schedule the next DagRun.

The default implementation raises NotImplementedError.

Parameters:
  • last_automated_data_interval (airflow.timetables.base.DataInterval | None) – The data interval of the associated DAG’s last scheduled or backfilled run (manual runs not considered). This is only None when the Dag is being scheduled for the first time, which happens when the Dag processor first parses the Dag – before any Dag run exists.

  • restriction (airflow.timetables.base.TimeRestriction) – Restriction to apply when scheduling the DAG run. See documentation of TimeRestriction for details.

Returns:

Information on when the next DagRun can be scheduled. None means a DagRun will not happen. This does not mean no more runs will be scheduled even again for this DAG; the timetable can return a DagRunInfo object when asked at another time.

Return type:

airflow.timetables.base.DagRunInfo | None

class airflow.timetables.simple.PartitionedAtRuntime[source]

Bases: NullTimetable

Timetable that never schedules anything; partition keys are set at runtime.

This corresponds to schedule=PartitionedAtRuntime().

A run’s partition_key (run-level provenance) must be supplied at trigger time — for example via the REST API’s partition_key field. Partition keys discovered at task runtime populate the emitted AssetEvent records but do not back-fill DagRun.partition_key after the run has been created.

description: str = 'Never, partition key(s) set at runtime'[source]

Human-readable description of the timetable.

For example, this can produce something like 'At 21:30, only on Friday' from the cron expression '30 21 * * 5'. This is used in the webserver UI.

partitioned_at_runtime = True[source]

Whether this timetable defers partition selection to task runtime.

True for PartitionedAtRuntime; downstream code can branch on this flag instead of using isinstance.

property summary: str[source]

A short summary for the timetable.

This is used to display the timetable in the web UI. A cron expression timetable, for example, can use this to display the expression. The default implementation returns the timetable’s type name.

airflow.timetables.simple.DEFAULT_PARTITION_MAPPER[source]
class airflow.timetables.simple.PartitionedAssetTimetable(*, assets, partition_mapper_config=None, default_partition_mapper=DEFAULT_PARTITION_MAPPER)[source]

Bases: AssetTriggeredTimetable

Asset-driven timetable that listens for partitioned assets.

partitioned = True[source]

Whether this timetable considers asset partitions.

This is True for timetables that switch scheduling to use partitions instead of the traditional logic based on logical dates and data intervals.

property summary: str[source]

A short summary for the timetable.

This is used to display the timetable in the web UI. A cron expression timetable, for example, can use this to display the expression. The default implementation returns the timetable’s type name.

partition_mapper_config[source]
default_partition_mapper[source]
get_partition_mapper(*, name='', uri='')[source]

Return the partition mapper for the asset identified by name or uri.

Only called by the scheduler when partitioned is True. The default implementation raises NotImplementedError; timetables that set partitioned = True must override this.

property partition_mapper_info: list[airflow.timetables.base.PartitionMapperInfo][source]

JSON-serializable snapshot of partition mapper attributes per asset.

One PartitionMapperInfo entry per asset (or asset ref) reachable from asset_condition. Each entry uses the mapper resolved by get_partition_mapper(), so assets covered only by default_partition_mapper (no partition_mapper_config entry) still appear with the default mapper’s is_rollup value. The UI reads this from the cached DagModel.partition_mapper_info instead of deserializing the timetable on each request.

Asset aliases are intentionally skipped: SerializedAssetAlias.iter_assets yields nothing (resolution happens at event time, not at parse time), and _build_name_uri_mapping() already warns that aliases are unsupported as partition_mapper_config keys. The cache therefore matches the alias-unsupported policy enforced elsewhere in this class.

serialize()[source]

Serialize the timetable for JSON encoding.

This is called during DAG serialization to store timetable information in the database. This should return a JSON-serializable dict that will be fed into deserialize when the DAG is deserialized. The default implementation returns an empty dict.

classmethod deserialize(data)[source]

Deserialize a timetable from data.

This is called when a serialized DAG is deserialized. data will be whatever was returned by serialize during DAG serialization. The default implementation constructs the timetable without any arguments.

Was this entry helpful?