← Back to all guides
Guide

Combine Your Data Exports Into One Dataset (2026)

Updated Oct 13, 2026

By the end of a proper takeout you have 43 downloads in 43 folders. Some are one CSV per metric, some are a single enormous JSON file, and a few are thousands of photos. None of them agree on anything. Dates are in three formats, timezones differ, and no two services call the same thing the same name. Merging them is possible and occasionally necessary. It is also the step most people should skip, and the reason is not laziness: for most exports, keeping them separate costs you nothing and joining them introduces errors you will not notice. A workout logged at 07:00 in Tokyo and a run at 07:00 in Berlin are the same string and two different events. This guide covers both sides. If you want one file, work down from level 1 to level 4 and stop when it does what you need. If you just want your data safe, <a href="/guides/backup-your-exports">back it up</a> and read the first section, which is the useful bit.

Do you actually need one file?

Most readers do not, and the merge is where data quietly goes wrong. Before combining anything, be clear about what you want the result to do.

There are three honest answers. "I want to be able to find a specific thing without opening 43 folders" is solved by an index file, not by a merge. "I want to count my activity across Strava and Garmin" is a real join, because the rows genuinely describe the same thing. "I want one file of my entire life" sounds appealing and produces a mess that answers no question.

  • You will probably want a spreadsheet. Most exports land in Excel or Google Sheets without any merging at all, one service per sheet. That is 90% of the value for about five minutes of work.
  • A real join is only meaningful where two services describe the same event. Fitness platforms overlap: the same run recorded on both Garmin and Strava. Chat platforms do not overlap, and joining a ChatGPT export to a Slack export gives you a timeline with nothing on it.
  • If your goal is analysis rather than tidiness, <a href="/guides/how-to-read-json-files">reading the JSON</a> matters more than joining it, and most of the value is in a single service rather than all of them.

Why the exports will not line up

This is the part that catches people, and it is why "just combine them" is not a five minute job. Four things differ between services, and three of them silently produce wrong answers rather than visible errors.

  • Date format. Some exports use 2026-03-15, some 15/03/2026, some 03/15/2026. The last two are ambiguous, and which one is which depends on the service rather than on anything in your file.
  • Timezone. Some services store UTC, some store your local time at the moment of the event, some store a UTC offset alongside a naive timestamp. A run logged at 07:00 can land on either side of midnight depending on which convention the service uses.
  • Epoch timestamps. JSON exports frequently give times as seconds or milliseconds since 1970. 1773500000 is a number, not a typo, and it is a date.
  • Schema. "Duration" might be seconds, might be milliseconds, might be a string like "00:45:30". "Distance" might be metres, might be miles. Nothing in the file tells you, and the same field name means different things in different exports.
  • Identity. There is no shared key. Nothing links "this Strava activity" to "this Garmin activity" except matching on time, which brings you back to the timezone problem.

Level 1: one spreadsheet, one sheet per service

This is the setup most people should stop at. You get one workbook you can actually search, and you keep every export exactly as the service sent it.

The point is that nothing has been transformed. Every row still means what it meant in the original file, so you can always go back and check against the source. This is the level where you cannot quietly corrupt your own archive.

  1. Create one folder per service, keep the original archives untouched inside them
  2. Open a spreadsheet and create one sheet per service, named the same as the folder
  3. Import each CSV into its sheet. Excel and Google Sheets both do this from Data > From CSV, or just double-click the file
  4. Add a column called "source" and fill it with the service name on every row. You will want it the first time two rows look identical and you need to know which is which
  5. Save it. Do not overwrite the original exports, this workbook is a view onto them, not a replacement

Level 2: appending many CSVs into one table

When every export is a flat CSV with the same columns, merging is genuinely easy and this is the right level. It is genuinely only valid when the files share a schema, so check the headers before you start.

  • Stop and check: if the date columns are in different formats across files, the sort will look plausible and be wrong. Normalise the format first.
  • If the columns do not match, you do not have a merge problem, you have a mapping problem. Go to level 3 or give up, because a union of mismatched columns produces a table with mostly empty cells.
  1. Put all the CSVs in one folder, with matching filenames
  2. Excel or Google Sheets: Data > Get Data > From Folder, which reads every CSV in the folder and stacks them into one table
  3. If your spreadsheet has no folder import, open each CSV, copy the rows, and paste them under the first one. Headers only once, at the top
  4. Add the "source" column if the files do not already carry an identifier
  5. Sort by whatever date column you have, and check the format is consistent across all of them before you trust the sort

Level 3: a real database

A single file database handles files that a spreadsheet cannot: too many rows for one sheet, different shapes per source, or a JSON structure that needs flattening first.

SQLite is the sensible default. It is a single file, it is free, and the whole database is one thing to back up. DuckDB is the better tool if you want to query the files directly in their original format without importing them at all, which saves an enormous amount of work when your exports are large JSON.

  • Joining on timestamp is a heuristic, not a fact. Two activities can start at the same second, and two accounts can disagree by a few seconds about when a watch recorded something. Expect near-duplicates and reconcile by hand.
  • Keep the original exports on disk even after importing. The database is derived data and you should be able to throw it away and rebuild it.
  1. Pick one. SQLite for a persistent database, DuckDB for querying files in place
  2. Create a table per service, so each keeps its own shape rather than forcing one schema on all of them
  3. Import each export into its table. If the export is JSON rather than CSV, flatten it on the way in
  4. Create a view that unions the tables you actually want to compare, rather than duplicating data into a new table
  5. Query it. This is where a real join is possible: match Garmin activities to Strava activities on timestamp and duration, once both are in UTC

Level 4: a script

Only worth it if you are doing this repeatedly, or if the data is genuinely too big for the tools above. A short Python script with pandas will read every CSV in a folder, normalise the dates, and write one combined file.

The script is the easy part. The value is in the handful of decisions it forces you to make explicitly: what "distance" means, which timezone a naive timestamp is in, and what to do with rows that match no other service. Those decisions are the same ones a database forces, and there is no way to skip them.

The date problem, in full

If you read one section of this guide, read this one. Every merge that goes wrong goes wrong here.

An export giving you "2026-03-15 07:00:00" with no zone is not UTC and is not necessarily your local time at the time. It is whatever the service decided to write, which varies by field within the same file. An export giving you 1773500000 is UTC by definition, and it is usually right. An export giving you an offset alongside the timestamp is the only one where you can be certain.

  • Pick one timezone for the whole dataset, convert everything into it, and record which one you picked. Mixing them produces activities that jump across days and steps that do not add up.
  • Daylight saving is where naive local timestamps break. An activity logged on the day the clocks change can be genuinely ambiguous in local time and impossible to recover afterwards.
  • Convert epoch seconds versus milliseconds by magnitude. Anything in the region of 1.7 billion is seconds, anything around 1.7 trillion is milliseconds.
  • Where a service gives no zone at all, treat it as UTC and write down that you assumed so. An assumption you recorded can be corrected later. One you forgot is invisible.

Deduplicating

After a merge, duplicates are normal and mostly harmless. Sync between a watch and a service produces the same workout twice, sometimes with slightly different values because each recorded it separately.

Do not delete them on principle. Keep both, add a column marking which one you kept and which you discarded, and keep the reason. Which record is more accurate depends on the device, and the answer is not always the service.

What not to bother with

Some merges are not worth attempting, and it is worth saying which.

Photos are the clearest case. Your media exports are thousands of image files with EXIF timestamps, and merging them means deduplicating by hash across platforms, which is a real project rather than a guide. If you want one photo library, use a tool built for it rather than exporting and merging by hand.

Chat histories are the second. The formats differ so much that merging them produces a file you cannot read, and the analytical question people actually want answered, which messages happened when, is better served by one service at a time.

Anything containing credentials, tax records or medical data should be combined on an encrypted volume, not in a spreadsheet in your Downloads folder.

Sources consulted

The practical steps here come from the documented behaviour of the export formats themselves rather than from any single vendor, and the per-service details are covered by the individual guides on this site.

  • <a href="/guides/how-to-read-json-files">How to Read JSON Files Without Coding</a>: opening and flattening the JSON exports before any of this
  • <a href="/guides/backup-your-exports">Back Up Your Data Exports</a>: keeping the originals safe, which is the prerequisite for everything here
  • <a href="/guides/how-to-verify-export-files-bit-rot">Verify Export Files With SHA-256</a>: proving the files you are merging are still intact
  • CSV as a format: RFC 4180, which specifies the quoting and escaping rules that explain why naive concatenation breaks
  • Epoch time: RFC 3339 and ISO 8601 for the string formats, and the Unix epoch convention for numeric timestamps

Related guides

FAQ

How do I merge multiple CSV exports into one spreadsheet?

If the files share the same columns, use your spreadsheet folder import, which reads every CSV in a directory and stacks them into one table. Add a "source" column before you start so you can tell which service each row came from. If the columns do not match, merging produces a table that is mostly empty cells, and you need a database instead.

Why do my merged activity dates look wrong?

Almost always a timezone mismatch. Some services store UTC, some store your local time at the moment of the event, and some give a UTC offset alongside a naive timestamp. Pick one timezone for the whole dataset, convert everything into it, and write down which one. Daylight saving is the other cause, because a local timestamp on the day the clocks change can be genuinely ambiguous.

Do I need to merge my exports at all?

For most people, no. One spreadsheet with one sheet per service gives you searchability without transforming anything, which means you cannot have quietly corrupted the data. Merging is worth it when two services genuinely describe the same events, such as the same run recorded on both a watch and Strava.

What is the best tool for combining large data exports?

DuckDB for querying files directly in their original format without importing them, which matters when the exports are large JSON. SQLite for building a persistent database you can query repeatedly. A spreadsheet is enough until you have more rows than one sheet can hold, which is further out than most people expect.

How do I remove duplicate activities after merging?

Expect them. Sync between a watch and a service records the same workout twice, sometimes with slightly different values. Do not delete them on principle. Keep both rows, add a column marking which one you kept and which you discarded, and keep the reason, because which source is more accurate depends on the device rather than the service.

About the author

Charles runs Digital Takeout Day, a twice-yearly reminder (May 8 and November 8) to download and back up your data from every online service you use.

Every guide is cross-checked against the platform's own export documentation and re-verified before each Takeout Day.

Read the full bio, editorial policy, and contact →