This repository contains county-level voter registration data for South Dakota, broken down by party.
Updated October 5, 2026
The data -- 188 snapshots in time -- comes from the South Dakota Secretary of State's website:
- December 2015 to present: Monthly snapshots, plus election totals
- June 1976 to November 2014 (source 1, source 2): Election totals, typically less detailed than current data
I use pdfplumber to parse the monthly reports.
Files are named after the snapshot date in YYYY-MM-DD.* format. Individual CSV files live in the data folder. The original PDFs, some of them rendered from web pages, live in the pdfs folder.
Build files.ipynb turns those individual snapshot files into two tidy combined CSV files, each with two new columns -- county_fips, derived from looking up county names in the us-county-fips.csv file, and election, which lists the type of election for that snapshot date, if applicable, sourced from a file I created, elex-lookup.json:
south-dakota-voter-registration-data.csv: The columns in this file aredate,county,county_fips,party,voters,election-- note that inactive is sometimes the "party" name, so if your goal is to analyze active voter registration, you'd need to filter these out first.south-dakota-voter-registration-data-simplified.csv: Same as above, except:- All non-Republican/Democratic party categories are collapsed into a single "other" category
- Inactive records are removed
- Two snapshot records for Washabaugh County, which merged with Jackson County in 1983, are removed
- Records for Shannon County, which was renamed Oglala Lakota County in 2015, are renamed with the current county name and given the associated FIPS code
The same notebook also builds _site/south-dakota-voter-registration.json, a statewide-and-by-county breakdown formatted for Chart.js, which powers this chart, which was built by Claude.
- 2026-09-01 snapshot correction: Republican and Democratic column labels were transposed in the PDF for the September 2026 report (
pdfs/2026-09-01.pdf), probably because this was a reversion to an older column layout after the July 2026 report used a different one.data/2026-09-01.csvhas been corrected at the source, so the swap doesn't need to be re-applied downstream.