Skip to content
czechdatasets

Czech municipalities in numbers: 786 indicators for every municipality, 2000–2025

786 Czech Statistical Office (ČSÚ) indicators for every municipality since 2000: population, schools, doctors, businesses, unemployment, budgets and censuses. One table with official municipality codes, plus 36 key figures for each municipality.

Free sample

One-time payment, final price for a personal licence, switch to business at checkout · data as of 22 July 2026

An island with a village green: a town hall with a small tower, a chapel, cottages, a pond and, in the middle, a large wooden abacus with coloured beadsAn island with a village green: a town hall with a small tower, a chapel, cottages, a pond and, in the middle, a large wooden abacus with coloured beads

How much work it saves

Merging 26 annual files of MOS (Městská a obecní statistika, the ČSÚ town and municipal statistics; 36.9 million rows of bare codes), attaching the code list of 800 indicators with methodology and coverage over time, turning 179,134 confidential values into NULL with a flag, leaving out 237,804 placeholder zeros from the first release for 2025, and giving 6,272 municipalities, dissolved ones included, their district, ORP (municipality with extended powers) and region for every year.

Measured on our own build

Lines of code and tests
908
AI agent tokens
22m
AI agent run time
40 mins

Tokens and time cover the first working version of the code, written with Claude Opus 5.5. Not counted: researching sources and licences, quality checks and later fixes.

  • Free sample: all tables cut down to the Kutná Hora area, in CSV and Parquet. Download the sample
Data as of
22 July 2026
Rows
37m
Tables
6
Formats
PostgreSQL, Parquet, CSV, JSON
Source licence
CC BY 4.0 (ČSÚ, ČÚZK)

What’s inside

All 786 MOS indicators for all municipalities of the Czech Republic in 2000–2025, in one long table with municipality codes from RÚIAN, the Czech register of addresses, buildings, parcels and territorial units: population, education, healthcare, economic entities, unemployment, municipal finances, land types, the 1991–2021 censuses and more. A code list of indicators with methodology, municipalities with their affiliation year by year, and a wide table of key indicators.

TableRows
okruhy17 statistical domains of MOS with counts of indicators and values17
ukazatelecode list of indicators: name, domain, unit, source, methodology, periodicity, years in the data800
obceall municipalities that occur in MOS (dissolved ones too), last known state, coordinates6,272
obce_rokymunicipality × year as MOS reports it, with its district, ORP and region in that year162,597
hodnotyall values in long format: municipality × year × indicator36,624,946
obce_prehledone row per present-day municipality, 36 key indicators from the latest available year6,258

Municipalities are in the boundaries valid in the given year; nothing is recalculated to today’s municipalities. The year 2025 is so far the first ČSÚ release (without education, healthcare and unemployment).

Downloads

Every format contains the same data. Download only the one you need; verify its integrity with the SHA256SUMS file.

FormatFilesSize
PostgreSQLschema.sql with types, keys, indexes and comments, and import.sh, which loads the data from CSV218 kB
ParquetOne file per table (zstd). DuckDB, Polars and pandas read it without an import.661 MB
CSVUTF-8, comma-separated, with a header; large tables as .csv.gz6153 MB
JSONAn array of objects; large tables as JSON Lines (.jsonl.gz)6195 MB

Code example

More examples for SQL, DuckDB, Python and Node.js are in the README.md inside the bundle.

Time series of one municipalityPostgreSQL
-- vývoj nezaměstnanosti a počtu obyvatel v Jihlavě
SELECT h.rok, u.nazev, h.hodnota, u.jednotka
FROM obce_v_cislech.hodnoty h JOIN obce_v_cislech.ukazatele u USING (ukazatel_kod)
WHERE h.obec_kod = 586846 AND h.ukazatel_kod IN ('110900', '500020')
ORDER BY h.ukazatel_kod, h.rok;
Your own wide panel, no importDuckDB
-- vlastní široký panel: obec × rok × vybrané ukazatele
PIVOT (SELECT obec_kod, rok, ukazatel_kod, hodnota FROM 'parquet/hodnoty.parquet'
       WHERE ukazatel_kod IN ('110900', '110200', '110300', '160100'))
ON ukazatel_kod USING max(hodnota) GROUP BY obec_kod, rok ORDER BY obec_kod, rok;
Dwellings per 1,000 inhabitants by regionPostgreSQL
-- dokončené byty na 1000 obyvatel podle krajů v historických hranicích
SELECT r.rok, r.kraj, round(1000 * sum(b.hodnota) / sum(o.hodnota), 2) AS byty_na_1000
FROM obce_v_cislech.hodnoty b
JOIN obce_v_cislech.hodnoty o ON o.obec_kod = b.obec_kod AND o.rok = b.rok AND o.ukazatel_kod = '110900'
JOIN obce_v_cislech.obce_roky r ON r.obec_kod = b.obec_kod AND r.rok = b.rok
WHERE b.ukazatel_kod = '121800' AND b.rok BETWEEN 2015 AND 2024
GROUP BY 1, 2 ORDER BY 1, 2;

Municipalities in numbers 2000–2025 for 290 CZK.

One-time payment, download right after paying, no account and no subscription. Updates to the dataset are included in the price. All 15 paid datasets together cost 2,490 CZK, 3,510 CZK less than buying them one by one.