Crosswalk for 2000 to 2010 State/County FIPS codes

I’m trying to create a crosswalk between 2000 and 2010 state and county FIPS codes. To do this I downloaded the nhgis_bgp2000_co2010.csv file from Geographic Crosswalks | IPUMS NHGIS and pulled the state and county FIP codes from the 2000 and 2010 variables. While they usually match between years there is sometimes a seemingly same code that matched to a different code in the next year.

For example for nearly all cases in the file with a FIPS county code of “071” in 2010 the FIPS county code in 2000 is “071”. Though there are about 50 cases where they have a different FIPS code in 2000. Why would this match for some cases but not others?


The Census Bureau continually makes improvements in its official boundary definitions across time, so many of its 2010 boundaries differ slightly from its 2000 boundaries. This results in numerous “slivers” of land that were in one county according to the Census’s 2000 boundaries and in a different county according to their 2010 boundaries. This same issue extends to state boundaries as well.

For your purposes, you may want to ignore most of these slivers. Very few of them contained substantial populations. If so, you might prefer to rely on this Census web page, which reports any “substantial” county change between 2000 and 2010.

Thanks, Jonathan. If I’m merging together two geographic files one with 2000 state and county FIPS and one with 2010 state and county FIPS, would that work? Would it just require me to update the 15 or so changes on the 2010 tab (from the page you shared) in the 2000 data? Or vice versa?

Thanks for your quick response!

Possibly. And, it depends. Unfortunately, there’s no hard-fast rule that applies to every situation.

There’s not a 1-to-1 relationship between 2000 and 2010 counties, so you can’t just replace each 2000 FIPS code with a 2010 FIPS. Sometimes boundaries change. Sometimes new counties are created by carving out parts of older counties (e.g., Broomfield County, Colorado, in 2001). Some counties are eliminated and merged into their neighbor(s).

To deal with all these changes, you’d first need to decide whether you want your observation units to be the 2000 counties (e.g., with no Broomfield County) or the 2010 counties (including Broomfield County). If you choose 2010 counties, then you need to decide how you’ll “update” the 2000 data to match with 2010 counties. For example, in order to generate 2000 county data for Broomfield, you’d ideally allocate appropriate proportions from the 4 counties that Broomfield was carved out of.

For a simple approximation, you can use the population counts on the page I linked to. E.g., if 200 people lived in the part of Boulder County that became Broomfield, then you could allocate data from 2000 Boulder to 2010 Broomfield in proportion to that population count. (You’d also need to get the total populations for all these counties in order to compute the proportions.) But that’s still just a rough estimate.

The ideal way to generate 2000 data for 2010 counties is not to use 2000 county data at all. Rather, start from the smallest possible units in 2000 (e.g., blocks or block group parts) and allocate up to the 2010 county boundaries. That way, you’d be allocating directly from the part of Boulder County that became Broomfield, rather than just estimating that population.

This is all explained in more detail on the NHGIS Crosswalks page. Generating high-quality 2000 data for 2010 counties is exactly why we provide the crosswalk from 2000 BGPs to 2010 counties.

That said, if the data you’re working with isn’t available for any units smaller than counties, then you might have to follow the procedures I outlined above for allocating 2000 county data to 2010 counties. Or you can ignore some changes, or omit the counties involved in changes from your analysis… Like I said, there is no hard-fast rule!