Skip to main content
FormatDrop
How-To Guide

How to Convert ICS to CSV (Calendar to Spreadsheet)

ICS (iCalendar, RFC 5545) is the universal calendar file format — Google Calendar, Apple Calendar, Outlook, every modern calendar app reads and writes it natively. CSV is the universal data format that Excel, Google Sheets, every database, and every BI tool consumes. Converting ICS to CSV is the right move whenever you need to analyze your meeting history (how many hours per week in 1:1s? how much time per attendee?), bulk-edit events for migration to another system, or feed calendar data into a custom report or dashboard. The conversion is mostly straightforward but recurring events, time zones, and attendees need careful handling — this guide covers all three.

FormatDrop doesn't convert ICS to CSV yet. The methods below use free tools that do. FormatDrop's own converters cover common image, audio, video and PDF formats, all in your browser.

Quick answer

Python: `pip install icalendar` then a 15-line script that walks events and writes CSV rows. For very large calendars, expand recurring events into individual instances using the recurrence rule before writing.

Method 1Python (icalendar)

Convert ICS to CSV with Python (best for analysis)

Python with the icalendar library is the most flexible option for ICS-to-CSV conversion. Supports recurring event expansion, time zone normalization, and custom field mapping.

  1. Install: `pip install icalendar pytz`.
  2. Basic conversion: `from icalendar import Calendar; import csv; cal = Calendar.from_ical(open('input.ics').read()); rows = []; for ev in cal.walk('vevent'): rows.append({'summary': str(ev.get('summary')), 'start': str(ev.get('dtstart').dt), 'end': str(ev.get('dtend').dt), 'location': str(ev.get('location') or ''), 'description': str(ev.get('description') or '')}); writer = csv.DictWriter(open('out.csv','w', newline=''), fieldnames=['summary','start','end','location','description']); writer.writeheader(); writer.writerows(rows)`.
  3. Expand recurring events using the dateutil library: `from dateutil.rrule import rrulestr; rule = rrulestr(str(ev.get('rrule')), dtstart=ev.get('dtstart').dt); for occurrence in rule.between(start_date, end_date): ...`.
  4. Normalize to UTC: `import pytz; utc_start = ev.get('dtstart').dt.astimezone(pytz.UTC)`.
  5. Extract attendees: `attendees = [str(a) for a in ev.get('attendee') or []]; rows[-1]['attendees'] = '; '.join(attendees)`.

Note: Python is the right tool for analytical workflows (meeting hour reports, attendee frequency analysis, time zone audits). For one-off conversions, the Google Calendar round-trip needs no install.

Method 2Google Calendar (round-trip)

Round-trip via Google Calendar (no install)

Import your ICS to Google Calendar, then export the calendar to CSV. Easy but contacts pass through your Google account briefly.

  1. calendar.google.com → Settings → Import & Export → Import → choose your .ics → select target calendar → Import.
  2. Once imported (a few seconds), use a third-party tool to export from Google Calendar to CSV — Google doesn't directly export CSV, but tools like 'Google Calendar to CSV' (calendar.google.com extensions) or scripts using the Google Calendar API do.
  3. Easier: use the Apps Script approach — paste a script into script.google.com, run, get CSV.
  4. Or: just import directly to a tool that handles ICS → CSV like Excel via a Power Query connector.

Note: Google's roundabout path is fine for small calendars but Python is faster for >100 events.

Method 3Excel Power Query

Import ICS directly to Excel via Power Query

Excel's Power Query feature can parse ICS files into a table directly, no conversion needed.

  1. Excel → Data → Get Data → From File → From Text/CSV → select your .ics file. Excel detects it as text.
  2. Use the M language editor to parse VEVENT blocks: split by 'BEGIN:VEVENT' and 'END:VEVENT', extract fields like SUMMARY:, DTSTART:, DTEND:.
  3. This requires custom M code — search 'Excel Power Query parse ICS' for templates. Easier for non-technical users to use Method 1 or Method 2.

Note: Power Query is powerful but the ICS parsing is manual. For occasional use, Python or the Google Calendar round-trip is easier.

When you need to convert ICS to CSV

  • 1

    Calculating total meeting hours per week or month

    Export your last 90 days of calendar to ICS, convert to CSV, open in Sheets, sum the (End - Start) column. Discover you're in 28 hours of meetings per week — actionable data for time management.

  • 2

    Building a meeting-attendee frequency report

    Pivot table on the attendees column → discover you spend 30% of your meeting time with one specific person. Useful for re-evaluating standing meetings.

  • 3

    Migrating events between systems that don't share ICS

    Some old systems import only CSV (legacy CRMs, custom calendaring tools). Convert your ICS to CSV, map columns to the destination's import schema, bulk import.

  • 4

    Time zone auditing for distributed teams

    Convert your team's combined ICS to CSV → analyze meeting times in each attendee's local time zone → identify scheduling patterns that disadvantage certain time zones (e.g., always 8 AM Pacific = midnight in Tokyo).

  • 5

    Compliance and legal record-keeping

    Some industries require meeting records for compliance. CSV is the standard format for legal hold systems. Convert and archive periodically.

Troubleshooting common ICS to CSV problems

Recurring events show as a single row instead of expanded

Use a converter that expands recurring events into individual instances. Python with dateutil's rrulestr is the most flexible. Or in your CSV tool's converter, look for 'Expand recurring' or 'Materialize occurrences' option.

Time zones are confusing or wrong in the CSV

ICS uses TZID references like 'America/New_York'. CSV is plain text and doesn't enforce time zone interpretation. Best practice: convert all times to UTC during ICS-to-CSV conversion (`pytz.UTC` in Python) to eliminate ambiguity. Add a 'time zone' column if you need to preserve original.

Multi-line descriptions break CSV parsing

Event descriptions in ICS can contain newlines. CSV parsers may treat these as row separators if quoting is wrong. Solution: ensure your converter uses quoting (RFC 4180 compliant CSV) — Python's csv.writer with `quoting=csv.QUOTE_ALL` handles this correctly.

Attendees come out garbled or missing

ICS attendees are 'mailto:' URIs with parameters (CN=Name, ROLE=REQ-PARTICIPANT, etc.). Most converters extract just the email. To preserve names: parse the CN parameter. Python: `attendee.params.get('CN')` for the name, `attendee` (the value) for the email.

Why convert ICS to CSV?

ICS is the format calendar systems speak; CSV is the format data tools speak. Converting unlocks bulk operations on your meeting history that would be tedious one event at a time. The most common use case is meeting analytics — how many hours per week, with whom, in which time zones — but bulk migration, compliance archiving, and time-zone audits are equally valuable.

The conversion is mostly mechanical for one-time events. Recurring events, time zones, and multi-line descriptions need care. Python with icalendar handles all three correctly; Google Calendar's roundabout path works when you can't install anything.

For analytical work, normalize times to UTC and expand recurring events. For migration, preserve RRULE and original time zones. The right strategy depends entirely on what you're going to do with the CSV downstream.

Frequently asked questions

Is converting ICS to CSV free?
Yes. Python with icalendar, Excel Power Query, and Google Calendar import-export are all free (Power Query needs Excel).
How are recurring events handled?
Two strategies. 'Expand' creates one CSV row per occurrence — best for analysis (counting hours, frequency reports). 'Preserve RRULE' keeps recurring events as a single row with the recurrence rule in a column — best for re-importing to another calendar system.
Will time zones convert correctly?
Depends on the tool. The safe path is normalizing all times to UTC during conversion. Then in your spreadsheet, add formulas to convert UTC back to your local zone for display. Mixed time zones in raw CSV cause confusion.
Best free tool for ICS to CSV?
The Google Calendar round-trip for one-off conversion (no install). Python with icalendar for analytical workflows or large calendars (faster, more flexible).
Can I convert just one event from a multi-event ICS?
Filter during conversion. Python: `if 'budget review' in str(ev.get('summary')).lower():` to filter by summary. Or convert all and filter the CSV in Excel.
Will the CSV import back to my calendar?
Most calendar systems don't natively import CSV — they prefer ICS. To round-trip: convert CSV back to ICS using a tool like csv2ics, or write Python to generate ICS from your modified CSV. Google Calendar accepts CSV import via Apps Script but not via the standard UI.
Browse FormatDrop's converters

No account. No upload. Works in any browser.