How to transpose a time-series csv from rows to columns
- Step 1Decide: do you have a matrix or a long table? — If your CSV is already a grid of dates × metrics (one cell per date/metric intersection) and you just want to swap the axes, the transpose is correct. If it is a long table with repeated dates and a
metric+valuecolumn, the transpose is the wrong operation — see the edge-cases section for the right tool. - Step 2Export the CSV from your pipeline — Pull the time-series CSV from your warehouse, analytics export, or BI tool. The transposer treats the file as a plain grid and does not interpret dates —
2026-01-01,01/01/2026, andJan-26are all just text to it. - Step 3Drop the file onto the tool — The transpose runs automatically on load. There are no options — no key-column picker, no aggregation function, no orientation toggle. The delimiter is auto-detected, and the flip is always rows ↔ columns.
- Step 4Confirm the axis swap from the stat cards —
Rows before/Columns beforeversusRows after/Columns afterconfirm the flip. A 366-row daily matrix with 5 metrics shows366 → 5rows and5 → 366columns — 366 date columns, which is a lot for a spreadsheet. - Step 5Read the preview before downloading — The preview shows the first 10 output rows. The first column is your original header. If you transposed a long table by mistake, the preview makes it obvious — you'll see repeated dates spread across columns, not a clean wide grid.
- Step 6Download the .transposed.csv — Output downloads with a
.transposed.csvsuffix as plain UTF-8 (no BOM). Load it into Looker Studio, Excel, or your charting tool. If the result has thousands of date columns, consider a database or pandas instead of a spreadsheet.
Transpose vs long-to-wide pivot
The single most important table on this page. These are different operations; this tool does the left column only.
| Operation | What it does | Right tool |
|---|---|---|
| Transpose (this tool) | Swaps the whole grid: cell [r][c] → [c][r]. No keys, no grouping | CSV Transposer — drop and flip |
| Long → wide pivot | Groups rows by a key column, spreads a value column into new named columns | pandas pivot / SQL CASE WHEN / Excel PivotTable |
| Wide → long melt | Collapses many value columns into key/value rows | pandas melt / a database UNPIVOT |
| Aggregate per period | Sums or averages many rows per date | Excel PivotTable / GROUP BY |
Before and after: a date-by-metric matrix
When your data is already a matrix, the transpose just swaps the axes. Values are untouched.
| Aspect | Source (dates as rows) | Output (dates as columns) |
|---|---|---|
| Grid shape | 4 rows × 4 columns (header + 3 dates, 3 metrics) | 4 rows × 4 columns |
| First column after flip | Header Date, Sessions, Signups | Date, Sessions, Signups as the label column |
| A date label | Row begins 2026-01-01, ... | 2026-01-01 becomes a column header |
| A metric value | 1234 under Sessions for Jan 1 | 1234 in the Sessions row, Jan-1 column |
| A null / missing value | Empty cell | Empty cell preserved (or padded) |
Free vs Pro limits for time-series files
CSV Transposer is a Pro tool. Daily/hourly series get large fast.
| Limit | Free | Pro |
|---|---|---|
| Max file size | 2 MB | 100 MB |
| Max rows processed | 500 | 100,000 |
| Practical note | ~500 days max at the free row cap | A 100k-row daily series flips to 100k date columns — past spreadsheet limits |
Cookbook
How the raw flip behaves on time-series shapes — including the long-table case where you should NOT use it.
Date-by-metric matrix: dates down → dates across
ExampleThe case the transposer is built for. A matrix with one row per date becomes one column per date, so a chart that wants metrics as series can read it directly.
Input (dates as rows): Date,Sessions,Signups 2026-01-01,1234,42 2026-01-02,1456,55 2026-01-03,1389,48 Download (.transposed.csv): Date,2026-01-01,2026-01-02,2026-01-03 Sessions,1234,1456,1389 Signups,42,55,48
Long table transposed — and why it's wrong
ExampleA tidy long table has repeated dates and a metric/value column. Transposing it does NOT pivot — it just flips, leaving repeated dates spread across columns. This is the case to use pandas for, not the transposer.
Input (long format — repeated dates): Date,Metric,Value 2026-01-01,Sessions,1234 2026-01-01,Signups,42 2026-01-02,Sessions,1456 Transpose gives (NOT a wide table): Date,2026-01-01,2026-01-01,2026-01-02 Metric,Sessions,Signups,Sessions Value,1234,42,1456 For a real long->wide pivot keyed on Date, use pandas: df.pivot(index='Date', columns='Metric', values='Value')
ISO timestamps and decimals carry across unchanged
ExampleThe transposer never parses dates or numbers. A full ISO-8601 timestamp with a timezone and a high-precision float survive exactly as written.
Input: Timestamp,Temp,Humidity 2026-01-01T00:00:00Z,21.345,0.62 2026-01-01T01:00:00Z,21.118,0.64 Output: Timestamp,2026-01-01T00:00:00Z,2026-01-01T01:00:00Z Temp,21.345,21.118 Humidity,0.62,0.64
Gaps in the series stay as blanks
ExampleMissing intervals are blank cells; the transposer never fills or forward-carries them. Ragged rows (an extra metric on some dates) are padded so the grid stays rectangular.
Input (Jan-02 missing Signups): Date,Sessions,Signups 2026-01-01,1234,42 2026-01-02,1456 Output (short row padded): Date,2026-01-01,2026-01-02 Sessions,1234,1456 Signups,42,
Semicolon-delimited warehouse export flips automatically
ExampleA European-locale export uses semicolons. The delimiter is auto-detected, so you change nothing — and decimal commas inside values are left alone.
Input (semicolon-delimited): Datum;Umsatz;Besucher 2026-01-01;1234,50;980 2026-01-02;1456,75;1020 Output (delimiter detected and preserved): Datum;2026-01-01;2026-01-02 Umsatz;1234,50;1456,75 Besucher;980;1020
Errors and edge cases
Real errors and silent failures sourced from each platform's own documentation. Match the wording to the row, fix what the row says to fix.
Long/tidy table transposed instead of pivoted
Wrong toolA date, metric, value long table will not become a clean wide table — the flip just spreads repeated dates across columns. This is the most common misuse. For a real long-to-wide reshape keyed on a column, use pandas pivot, a SQL CASE WHEN / crosstab, or an Excel PivotTable. The transposer has no concept of a key column.
Aggregation expected but none happens
Not aggregatedIf multiple rows share a date (e.g. one row per region per day) the transpose produces multiple columns with the same date header — it never sums or averages. Aggregate first with a PivotTable or GROUP BY, then transpose the summarised matrix if you still want the axes swapped.
366 daily rows become 366 columns
Spreadsheet limitA one-year daily matrix flips into 366+ date columns; hourly data is far worse. Excel caps at 16,384 columns and Google Sheets is similarly limited, so wide time series transpose into files spreadsheets struggle to open. Keep wide outputs in a database or pandas, or chart from the original orientation.
Dates are text, never sorted
By designThe transposer treats dates as plain strings and never sorts them. If your source rows were out of date order, the resulting columns are out of order too. Sort the source first with csv-sorter so the date columns come out chronological.
Mixed date formats in one column
Preserved2026-01-01, 01/01/2026, and Jan-26 in the same date column are all carried across as written — the tool does not normalise formats. Inconsistent date columns become inconsistent date headers. Normalise with csv-find-replace before transposing if your chart needs uniform headers.
Gaps and nulls not filled
PreservedMissing intervals stay as empty cells; the transposer never forward-fills or interpolates. Ragged rows are padded to the widest row, so blanks appear where data was absent. If your charting tool needs a value for every interval, fill gaps upstream.
Free-tier cap exceeded
BlockedFree processing stops at 2 MB and 500 rows; this is a Pro tool. A daily series of more than ~500 rows, or any high-frequency dataset, will hit the free cap. Upgrade to Pro (100 MB / 100,000 rows) or split with csv-row-limiter and flip the slices.
Source already in the target orientation
ExpectedIf your matrix already has dates across the columns and you transpose it, you get dates down the rows — the flip is symmetric. The stat cards make the swap obvious. Transpose twice and you're back where you started; check orientation before downloading.
Embedded newline in a label cell
Preserved if quotedA metric name or annotation containing a line break is handled correctly only if RFC-4180 quoted in the source (the parser respects quoted newlines). An unquoted newline is read as a new row and shifts the grid. Quoted multi-line cells transpose cleanly.
Empty rows between sections
PreservedThe parser keeps blank lines (skipEmptyLines: false), so a separator row between data blocks becomes an empty column after the flip. Drop blank rows first with csv-empty-row-remover if you don't want stray empty columns.
Frequently asked questions
Is transposing the same as a long-to-wide pivot?
No — and this is the key thing to get right. A transpose flips the entire grid (rows become columns and vice versa) with no concept of keys or grouping. A long-to-wide pivot groups rows by a key column and spreads a value column into named columns. If your data is a tidy date, metric, value long table, transposing it will NOT produce a clean wide table — use pandas pivot, a SQL crosstab, or an Excel PivotTable for that.
When should I use the transposer for time series, then?
When your data is already a matrix — one cell per date/metric intersection — and you just want to swap the axes (dates down the rows ↔ dates across the columns). That is a pure orientation change, which is exactly what the transpose does. If there are repeated keys and a separate value column, it's a pivot, not a transpose.
Does it sort my dates or normalise the format?
No on both counts. Dates are treated as plain text — never parsed, sorted, or reformatted. If your source rows are out of order, the date columns come out of order; sort first with csv-sorter. If formats are mixed, normalise with csv-find-replace before flipping.
Will gaps in my series be filled?
No. Missing intervals stay as blank cells, and the tool never forward-fills or interpolates. Ragged rows are padded to the widest row so the output grid is rectangular, but the padding is empty cells, not imputed values.
My output has hundreds of date columns — is that expected?
Yes, if you transposed a daily or hourly matrix: each date row becomes a column. A year of daily data is 366 columns; hourly is far more. Spreadsheets cap at 16,384 columns, so for high-frequency series keep the wide result in a database or pandas rather than opening it in Excel.
Can I pick which column becomes the new headers?
No — there are zero options. The transpose runs automatically and always moves the original header row to the first column. Promoting a specific column to headers is a pivot operation; use pandas or Excel for that. The transposer only swaps axes.
Does it handle ISO-8601 timestamps with timezones?
Yes — as text. A value like 2026-01-01T00:00:00Z is carried across byte-for-byte; the tool never parses or converts it. The same is true of high-precision decimals and scientific notation: they survive exactly as written.
What delimiter does it expect?
Whatever your file uses — the delimiter is auto-detected (comma, semicolon, or tab). EU-locale exports that use semicolons (because the comma is the decimal separator) flip correctly without any setting, and the decimal commas inside values are left untouched.
How big a time series can I transpose?
Free tier caps at 2 MB and 500 rows; this is a Pro tool, with Pro limits of 100 MB and 100,000 rows. Because rows become columns, the real constraint is usually the spreadsheet you load the result into, not the transposer — past a few thousand date columns, switch to pandas or a database.
Is my analytics data uploaded?
No. Parsing and transposing run entirely in your browser via PapaParse. The time-series values and any embedded identifiers never reach a server. If signed in, only an anonymous run counter (no content) is recorded for your dashboard.
Can I get a clean wide table without writing code?
If your data is a long table, the transposer alone won't do it. A no-code path: build a PivotTable in Excel/Google Sheets (drag Date to rows, Metric to columns, Value to values), then export that as CSV. If you only need the axes swapped on an already-pivoted matrix, the transposer is the one-step option.
Why did transposing my long table produce duplicate column headers?
Because a long table repeats the key value (e.g. each date appears on several rows). Transposing turns each of those rows into a column, so you get repeated date headers. That's the signature symptom of using a transpose where a pivot was needed — collapse the duplicates with a PivotTable or GROUP BY first.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.