When a County Renames Itself, Its Number Moves
FIPS codes look like serial numbers, but they are positions in an alphabetized list — and three renames since 1997 are enough to cut a county's history into two unusable halves.
A FIPS county code looks like a serial number. Five digits, zero-padded, stamped on every row of every county-level election file in the country. It has the shape of a thing assigned once, at manufacture, and never touched again. It is not that. It is a position in an alphabetized list, and the list was frozen decades ago in a form that assumed counties would keep their names.
When a county changes its name, its position in the alphabet changes, and so does its number. Dade County, Florida became Miami-Dade County effective 1997-07-22, and its code moved from 12025 to 12086. Nothing about the place moved. Same boundaries, same precincts, same voters, same ballots. The code changed because "Miami-Dade" falls between Martin (12085) and Monroe (12087), and the codes are alphabetical.
That is a harmless-sounding fact with an ugly downstream consequence. Join a quarter century of election returns on FIPS and you do not get an error. You get two counties: one that existed until mid-1997 and then vanished, and one that appeared out of nowhere the same summer. Both are truncated. Neither is flagged. The break is invisible precisely because the join succeeded.
An alphabet, not a serial number
Three renames matter most for anyone assembling a modern county-level series, and all three follow the same mechanic: new name, new alphabetical position, new number.
| Change | Effective | Old FIPS | New FIPS |
|---|---|---|---|
| Dade County, FL → Miami-Dade County | 1997-07-22 | 12025 | 12086 |
| Shannon County, SD → Oglala Lakota County | 2015-05-01 | 46113 | 46102 |
| Wade Hampton Census Area, AK → Kusilvak Census Area | 2015-07-01 | 02270 | 02158 |
The South Dakota change came by referendum, which passed 2,161 to 526. The Alaska change retired a name honoring a Confederate general who never visited Alaska. Whatever one thinks of either decision, neither was a decision about data, and neither moved a single voter across a single boundary line. The renumbering is a pure artifact of the filing system.
What the break actually looks like
Take Oglala Lakota County, South Dakota. Under a naive FIPS join, the county's electoral history arrives as two objects. The first is 46113, with results for 2000, 2004, 2008 and 2012, and then nothing. The second is 46102, which begins in 2016 and runs to 2024. Four cycles and three cycles, sitting in the same table, describing the same ground, never touching.
Everything you would want to do with that county now fails quietly. A trend line has no trend. A swing calculation between 2012 and 2016 has no prior value to subtract from. A page that requires a minimum run of cycles drops the county entirely. And a reader looking for one of the most lopsided counties in the country finds two half-histories, or nothing at all.
The fix is to stop treating the code as the identity
The repair is conceptually simple and structurally annoying: a place gets its own internal identity, and the FIPS code becomes an attribute of that identity with an effective date range attached. 46113 and 46102 are two labels the same unit wore in different decades. So are 12025 and 12086. So are 02270 and 02158. Codes become lookup keys, which is what they were always good for. They stop being the primary key, which is what they were never fit for.
Done that way, Oglala Lakota County is one continuous seven-cycle series on Politigoat, 2000 through 2024, with no gap at 2015 and no phantom county born in 2016. Lean below is the county's two-party margin minus the national two-party margin for the same cycle.
| Cycle | County two-party margin | National two-party margin | Lean |
|---|---|---|---|
| 2000 | D+73.7 | D+0.6 | D+73.1 |
| 2004 | D+74.3 | R+2.5 | D+76.8 |
| 2008 | D+80.0 | D+7.4 | D+72.6 |
| 2012 | D+88.0 | D+4.0 | D+84.0 |
| 2016 | D+82.5 | D+2.2 | D+80.3 |
| 2020 | D+81.0 | D+4.5 | D+76.5 |
| 2024 | D+72.7 | R+1.5 | D+74.2 |
That distinction is the entire point of separating identity from code. One of those two changes belongs on a chart. The other belongs in a footnote.
The dangerous case is the one that doesn't break
Renames are loud failures. You lose a county, you notice, you fix it. The genuinely hazardous case is the opposite: the boundary moves and the code stays put.
Petersburg Borough, Alaska changed territory on 2013-01-03 and kept FIPS 02195, with a population transfer of roughly 613 people. Every join on that code succeeds. Every row count reconciles. Every schema check, null check and referential-integrity check passes. And the 2012 row and the 2016 row describe measurably different geography.
Every join succeeds. Every validation passes. And the two endpoints are different places.
There is no automated defense against a stable code over shifting ground, because the only signal a boundary change gives off is a change in the numbers, and change in the numbers is what we are here to measure. These have to be carried as annotations, entered deliberately, and shown to the reader rather than smoothed away.
Why sources still disagree about Miami-Dade
None of this is settled history. Crosswalks in circulation today handle the Florida rename in incompatible ways: some recode the modern 12086 back to the historical 12025 so that pre-1997 files line up, while others keep 025 in place on their own terms. Mix two vendors with opposite conventions in one pipeline and Miami-Dade is counted twice, at full weight, in a state where that is not a rounding error.
Code churn is also not finished. Connecticut retired eight county-equivalents and adopted nine planning regions between the 2020 and 2024 Census vintages, and the national county-equivalent count moved from 3,143 to 3,144. Any system that assumes the identifier list is static will meet the same wall again, on a schedule nobody controls.
So the working rule here is short. A FIPS code is an address, not a name. Places keep their names.
Sources