Celery Beat crontab() Schedule
Celery Beat schedules periodic tasks using a crontab() object, not a raw cron string. You pass keyword fields — minute, hour, day_of_week, day_of_month, month_of_year — which map directly onto the cron fields.
crontab() keywords
Weekdays at 09:00 (cron 0 9 * * 1-5):
from celery.schedules import crontabcrontab(minute=0, hour=9, day_of_week='mon-fri')
Every 15 minutes: crontab(minute='*/15'). Every day at midnight: crontab(minute=0, hour=0) (the default for omitted fields is *).
Register it
In your Celery config: app.conf.beat_schedule = {'job': {'task': 'tasks.myjob', 'schedule': crontab(minute=0, hour=9, day_of_week='mon-fri')}}.
Intervals without cron
For simple fixed gaps use a number or timedelta instead: 'schedule': 30.0 (every 30 seconds) or timedelta(minutes=5).
Run the beat
Start the scheduler with celery -A proj beat (or worker -B for both in one process).
FAQ
Does Celery Beat take a cron string?
No — it uses a crontab() object with keyword fields (minute, hour, day_of_week, day_of_month, month_of_year) that map onto the cron fields.
What is the Celery crontab for weekdays at 9am?
crontab(minute=0, hour=9, day_of_week='mon-fri'), equivalent to the cron expression 0 9 * * 1-5.
How do I run a Celery task every 30 seconds?
Use a number or timedelta as the schedule instead of crontab: 'schedule': 30.0 or timedelta(seconds=30).