{"library":"recurring-ical-events","title":"Recurring iCal Events","description":"This library calculates recurrence times of events, todos, alarms, and journals based on the iCalendar RFC5545 specification. It provides a convenient way to expand recurring events within a given time range from an iCalendar object. The current version is 3.8.1, with a regular release cadence as evidenced by frequent updates.","language":"python","status":"active","last_verified":"Fri May 15","install":{"commands":["pip install recurring-ical-events"],"cli":null},"imports":["import recurring_ical_events","recurring_ical_events.of(calendar).between(start_date, end_date)"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import recurring_ical_events\nimport icalendar\nimport datetime\n\n# An iCalendar string with a daily recurring event\ncalendar_string = \"\"\"BEGIN:VCALENDAR\\nPRODID:-//Example Corp.//iCalGen 1.0//EN\\nVERSION:2.0\\nBEGIN:VEVENT\\nDTSTART;TZID=America/New_York:20231201T090000\\nDTEND;TZID=America/New_York:20231201T100000\\nRRULE:FREQ=DAILY;COUNT=3\\nSUMMARY:Daily Meeting\\nEND:VEVENT\\nEND:VCALENDAR\"\"\"\n\n# Parse the iCalendar string\ncalendar = icalendar.Calendar.from_ical(calendar_string)\n\n# Define the period for which to get events\nstart_date = datetime.datetime(2023, 11, 20, tzinfo=datetime.timezone.utc)\nend_date = datetime.datetime(2023, 12, 31, tzinfo=datetime.timezone.utc)\n\n# Get recurring events within the specified period\nevents = recurring_ical_events.of(calendar).between(start_date, end_date)\n\nprint(f\"Found {len(events)} events:\")\nfor event in events:\n    print(f\"- {event['SUMMARY']} on {event['DTSTART'].dt.isoformat()}\")","lang":"python","description":"This quickstart demonstrates how to parse an iCalendar string, extract a recurring event, and then expand its occurrences within a specified date range using the `recurring_ical_events` library. It uses `icalendar` for parsing the base calendar and `datetime` for defining the period.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-15","installed_version":"3.8.2","pypi_latest":"3.8.2","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.3,"avg_import_s":0.38,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"recurring-ical-events","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.29,"mem_mb":7.6,"disk_size":"29.1M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"recurring-ical-events","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.2,"import_time_s":0.2,"mem_mb":7.6,"disk_size":"30M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"recurring-ical-events","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.59,"mem_mb":7.6,"disk_size":"31.9M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"recurring-ical-events","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.4,"import_time_s":0.52,"mem_mb":7.6,"disk_size":"32M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"recurring-ical-events","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.43,"mem_mb":7.2,"disk_size":"23.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"recurring-ical-events","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.2,"import_time_s":0.47,"mem_mb":7.2,"disk_size":"24M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"recurring-ical-events","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.42,"mem_mb":7.7,"disk_size":"22.9M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"recurring-ical-events","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.2,"import_time_s":0.44,"mem_mb":7.7,"disk_size":"23M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"recurring-ical-events","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.22,"mem_mb":7,"disk_size":"26.4M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"recurring-ical-events","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.5,"import_time_s":0.2,"mem_mb":7,"disk_size":"27M"}]}}