Pace charting, worked

How a coefficient pace chart is built, and where a spreadsheet loses it

A season of pace charts usually starts as one column of seed times in a spreadsheet and one multiplication that never quite comes back right. Somewhere between typing 2:14.6 and reading it back, the hundredths are gone and the cell says 0.00155787. This page takes one real roster block through the whole thing: what a coefficient column is, how a cell gets rounded, and what lands back in the sheet at the end of it.

Open the pace grid

The column

A coefficient column, held to hundredths

A pace chart is one base time per athlete and one number per zone. The base is whatever you already trust: a time trial, a recent race, the repeat the squad swims every week. The zone is a coefficient, and that coefficient is the whole definition. At 1.18 the column asks for eighteen percent slower than base. At 1.00 it hands the base straight back, worth keeping while you build a set: it shows whether a time was read the way you meant. A fixed physiological model would pick those numbers for you from one race result and a published curve. Here they're yours, because the set of coefficients a program runs on is the program, and it moves with the block and the athlete.

multiply column  cell = round( base × coefficient )

divide column    cell = round( base ÷ coefficient )

round = half up, applied once, at the displayed unit (0.01 s, 0.1 s or 1 s)

base
The athlete's time, stored as an exact whole number of hundredths and assembled from the digits you typed rather than through a decimal approximation.
coefficient
Up to four decimal places, stored as an integer at ten thousand times face value, so 1.18 is exactly 11800 and never 11799.99.
operator
Multiply or divide, set per column, never folded into the coefficient.

Multiply and divide are not two ways of writing the same zone. Take a base of 2:14.60. Divided by 1.10 it is 2:02.36. Multiplied by 0.90 it is 2:01.14. The first asks for a time standing in a 1.10 ratio to the base, the way a coach says it on deck; the second asks for ninety percent of it. That's 1.22 seconds apart at a two minute base, and the gap widens as the base grows. So the operator sits on the column where you can see it, and nobody has to type 0.9091 to mean something simple.

Rounding happens once, at the precision you are looking at.

Everything before that step is exact. A cell is held as a fraction over integers, base times coefficient over ten thousand for a multiply column and base times ten thousand over the coefficient for a divide, and nothing is rounded until the moment it is drawn. That is why dropping the display from hundredths to whole seconds cannot round an already rounded number a second time, and why the same chart on screen, in Sheets and in the CSV agrees to the character.

One roster

Four names out of a sheet, twelve cells back

Here is a block copied straight out of a squad spreadsheet, tabs and all, with one row where a lane number rode along with the selection.

Pasted from the sheet
Athlete	Seed time
Ada Whelan	2:14.6
Priya Rana	2:07.45
Tom Okafor	2:21
Sam Idris	2:19.2	lane 4

The rows land in the grid the moment you paste. No preview, no confirm step. Then it says what it did:

4 rows added from 5 pasted lines. The first line read as a header, so it is not an athlete. 1 row needs a readable time before it computes.

What the tool read

LineRead asWhy
Ada Whelan 2:14.62:14.60One colon means mm:ss, so the missing hundredths are filled in rather than guessed at.
Priya Rana 2:07.452:07.45Already at hundredths. The field keeps the characters you pasted either way.
Tom Okafor 2:212:21.00Two minutes twenty-one, not two hours twenty-one. One colon always means mm:ss.
Sam Idris 2:19.2 lane 4not readThe lane number rode in on a second tab and landed in the time field, so the row is flagged where it sits: letters and symbols don't read as a time.

Each row keeps the characters you pasted and prints the reading underneath, which is where a colon slip gets caught. 1:07.45 and 1:07:45 are one character apart and nowhere near each other: a minute and seven and a half seconds against an hour, seven minutes and forty-five. The slip surfaces on screen before it multiplies through five columns.

Sam's row is kept, not dropped. It sits in the grid holding the raw text under the line This row sits out of the chart until the time reads, which is also where you fix it. An athlete who silently vanishes between the spreadsheet and the chart is the failure this paste path was shaped around.

Now the columns. Rename them to whatever your program calls them, type the coefficient, and flip the last one to divide, because a goal column asks for a time two percent quicker than base, not two percent of it.

AthleteBaseAerobic× 1.18Threshold× 1.08Race× 1.00Goal÷ 1.02
Ada Whelan2:14.602:38.832:25.372:14.602:11.96
Priya Rana2:07.452:30.392:17.652:07.452:04.95
Tom Okafor2:21.002:46.382:32.282:21.002:18.24

Sam is absent from all four columns and from any export until the time reads.

Priya's race column is her base handed back: 2:07.45. Drop the display to tenths and it reads 2:07.5. Drop it to whole seconds and it reads 2:07, not 2:08. Both readings came from the same exact 127.45 seconds, which sits nearer 127 than 128. Only a chart that rounded twice would have shown 2:08.

Ties go up, and the grid will show you one. Ada at 112.5% is exactly 2:31.425. The cell reads 2:31.43.

Copying the chart gives you a header row and one row per athlete, tab separated, so it lands cell per cell:

What lands in the sheet
Athlete	Aerobic	Threshold	Race	Goal
Ada Whelan	2:38.83	2:25.37	2:14.60	2:11.96
Priya Rana	2:30.39	2:17.65	2:07.45	2:04.95
Tom Okafor	2:46.38	2:32.28	2:21.00	2:18.24

The line under the button says the same thing: 3 rows by 4 zones copied · 1 held row left out. Exclusions get said out loud at export time, not found a week later in the sheet.

The clipboard is the part we rebuilt twice. Sheets reads a per-cell type declaration off the rich flavour of the clipboard, and that declaration is what keeps 2:14.60 a string with no apostrophe left sitting in the cell. Excel and Numbers don't read it, so for those two the CSV download is the route you can steer. The file follows RFC 4180, the 2005 CSV memo: CRLF between records per §2.1, embedded quotes doubled per §2.7, so an athlete entered as Ortiz, Ben can't shift the columns below. The formulas for staying inside the sheet are on the tool page, both the naive one and the one that survives an edit.

Ninety seconds, start to sheet

Roster in, chart out, back where the plan lives

Paste the roster

Drop a block of names and times straight out of the sheet you keep. Tabs, commas and runs of two or more spaces all parse, and a header line is left out.

Shape the zones

Type each coefficient as a multiplier or a percentage, rename the columns, flip any of them between multiply and divide. The chart recomputes as you type.

Take it with you

One press copies the grid for Sheets, or download the CSV for Excel and Numbers. The address bar carries the whole chart, so you can bookmark it in September and open it again in March.

Questions

Questions about the arithmetic and the paste

Why does multiplying a time by a percentage in Google Sheets lose the hundredths?

Because a duration in a spreadsheet cell is not a count of seconds. It's a fraction of a day, shown through whatever number format the sheet guessed while you typed. One minute is 1/1440 of a day, so one minute times 1.33 comes back as 0.00092361 of a day: arithmetically perfect, and unreadable on a pool deck. The default time format stops at whole seconds, so the hundredths are usually the first thing to go. Inside the sheet the fix is to convert to seconds, round once, then format the result back to text, which is what TEXT(ROUND(TIMEVALUE("0:" & A2) * 86400 * 1.33, 2) / 86400, "m:ss.00") does. The full formula sits on the tool page. Coeffpace runs the same arithmetic for a whole roster and hands the chart back as text on the way out.

What does a coefficient column do to a base time?

It multiplies or divides that athlete's base time by one number, and that number is the entire definition of the zone. A column at 1.18 asks for eighteen percent slower than base. A column at 1.00 hands the base back, which is worth keeping while you build a set because it shows you at a glance whether the times were read the way you meant them. A column carries a label, a coefficient and an operator, and every row gets the same treatment down the column. Nothing in a column is per athlete, so one paste of seed times fills the whole chart.

Can I enter my own zone percentages instead of multipliers?

Yes. The notation switch above the grid flips every column between 1.18 and 118%, and a value typed with a percent sign is read as a percentage in either mode. Both forms store the same number, so a chart written in percentages computes identically to the same chart written in multipliers, and the line under each field shows the other form while you type. Percent entry stops at two decimal places, which is the same limit as a four decimal place multiplier seen through the percent scale.

How does the rounding work, and why doesn't the whole-seconds column match the hundredths rounded again?

Every cell starts as an exact fraction: base times coefficient over 10000 for a multiply column, base times 10000 over the coefficient for a divide column. That exact value is rounded once, half up, at whatever precision you are displaying, and it is never rounded a second time. A base of 2:07.45 in a 100% column reads 2:07.45 at hundredths, 2:07.5 at tenths and 2:07 at whole seconds, because 127.45 seconds is closer to 127 than to 128. Round the hundredths reading to tenths first and you get 2:07.5, and rounding that again gives 2:08, a full second the athlete never owed. Changing the precision changes what you see, never what was computed. Ties go up: 2:14.60 at 112.5% is exactly 2:31.425, and the cell shows 2:31.43.

Does dividing a time by 1.10 give the same answer as multiplying it by 0.90?

No, and the gap is wider than it looks. A base of 2:14.60 divided by 1.10 is 2:02.36. The same base multiplied by 0.90 is 2:01.14. They answer different questions. Divide asks for a time that stands in a 1.10 ratio to the base, which is how a coach usually says it out loud, and multiply asks for ninety percent of the base. The operator therefore sits on the column where you can see it instead of being folded into the coefficient, and you never have to type a reciprocal like 0.9091 to say something simple.

Will times pasted into Google Sheets stay text instead of turning into a duration or a date?

That's what Copy for Google Sheets is built for. The clipboard payload carries a per-cell type hint that Sheets reads, so 1:19.80 lands in its own cell and stays a string rather than being re-read as a duration or a date. If the browser refuses the rich clipboard flavour, the fallback puts a leading apostrophe on the time cells only, which is the older way of saying the same thing. Excel and Numbers ignore the Sheets-specific hint and apply their own formatting to a block of times, so the CSV download is the better route there: choose Text for the time columns in the import dialog. In Sheets the equivalent setting is Convert text to numbers, dates, and formulas, which you want switched off.

Where does my roster go?

Nowhere. Every calculation runs in the page, there is no account and no server call, and no name or time is uploaded anywhere. The chart is kept in two places on your own machine: the address bar, which carries the whole chart as a link, and your browser's local storage, so closing the tab and coming back later returns the last chart you had open. Reset, or clearing site data, removes both.

How do I get the same chart back in six months?

Copy the share link and keep it wherever your season plan lives. The link carries the roster, the column labels, the coefficients, the operators and the display settings, so opening it rebuilds the chart on any machine with no account and nothing to install. If a chart grows past what a browser will reliably carry in an address bar, the tool stops updating the link rather than writing a truncated one, and it says so on screen. Reopening the tool with no link at all restores whatever you had last time from local storage.