Quick answer
Online: drop your .ics into formatdrop.com/document-converter, choose CSV, download. 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 1: Convert ICS to CSV online (free, in your browser)
- 1
Open the FormatDrop document converter
Open formatdrop.com/document-converter in your browser. Conversion runs locally — your calendar data stays on your device. Critical for sensitive personal calendars.
Go to converter - 2
Drop your ICS file
Drag your .ics file. Get one by exporting from your calendar: Google Calendar → Settings → Import & Export → Export; Apple Calendar → File → Export → Export Calendar; Outlook → File → Save Calendar.
- 3
Choose CSV format and recurring-event behavior
Select CSV. Choose how to handle recurring events: 'Expand' creates one row per occurrence in a date range (best for analysis); 'Keep RRULE' keeps recurring events as a single row with the rule preserved (best for re-import to another calendar).
- 4
Download and analyze in Excel or Sheets
Each event is a row; columns are Subject, Start, End, Location, Description, Organizer, Attendees. Pivot tables work great for meeting-hours-per-day or time-per-attendee reports.
Method 2: 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.
- Install: `pip install icalendar pytz`.
- 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)`.
- 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): ...`.
- Normalize to UTC: `import pytz; utc_start = ev.get('dtstart').dt.astimezone(pytz.UTC)`.
- 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 browser tool is faster.
Method 3: 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.
- calendar.google.com → Settings → Import & Export → Import → choose your .ics → select target calendar → Import.
- 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.
- Easier: use the Apps Script approach — paste a script into script.google.com, run, get CSV.
- 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 4: Import ICS directly to Excel via Power Query
Excel's Power Query feature can parse ICS files into a table directly, no conversion needed.
- Excel → Data → Get Data → From File → From Text/CSV → select your .ics file. Excel detects it as text.
- Use the M language editor to parse VEVENT blocks: split by 'BEGIN:VEVENT' and 'END:VEVENT', extract fields like SUMMARY:, DTSTART:, DTEND:.
- 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, the browser tool or Python 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; the browser tool handles common cases; 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.
Your files never leave your device
FormatDrop runs the conversion engine entirely inside your browser using WebAssembly. No file upload. No server. Nothing stored. You can verify this by opening DevTools → Network tab and watching: zero upload requests.
Frequently asked questions
Is converting ICS to CSV free?
How are recurring events handled?
Will time zones convert correctly?
Best free tool for ICS to CSV?
Can I convert just one event from a multi-event ICS?
Will the CSV import back to my calendar?
No account. No upload. Works in any browser.