Postal Codes Dataset for Greece, GR

438
Updated:
Files:1
Size:103 kB
Rows:1,041
Formats:csv
License:CC-BY-SA-4.0

Postal Codes Dataset for Greece, GR including name of the city, town, or place, various administrative divisions and alternative city names.

Part of a Data Solution

  • Postal Codes Solution

    Every worldwide postal-code dataset in one bundle — the ultimate global reference for precise postal codes.

    Explore →

API Access

Access dataset files directly from scripts, code, or AI agents.

Browse dataset files
Dataset Files

Each file has a stable URL (r-link) that you can use directly in scripts, apps, or AI agents. These URLs are permanent and safe to hardcode.

/logistics/postal-codes-gr/
https://datahub.io/logistics/postal-codes-gr/_r/-/.licensing-notes.md
https://datahub.io/logistics/postal-codes-gr/_r/-/.migration-notes.md
https://datahub.io/logistics/postal-codes-gr/_r/-/ATTRIBUTION.txt
https://datahub.io/logistics/postal-codes-gr/_r/-/README.md
https://datahub.io/logistics/postal-codes-gr/_r/-/datapackage.yaml
Key Files

Start with these files — they give you everything you need to understand and access the dataset.

datapackage.yaml— metadata & schema
https://datahub.io/logistics/postal-codes-gr/_r/-/datapackage.yaml
README.md— documentation
https://datahub.io/logistics/postal-codes-gr/_r/-/README.md
Typical Usage
  1. 1. Fetch datapackage.yaml to inspect schema and resources
  2. 2. Download data resources listed in datapackage.yaml
  3. 3. Read README.md for full context

Data Files

Explore with AI

postal-codes-gr

Download

Download CSV

About

Last updated
5 October 2026
Total rows
1,041
Format
CSV
File size
103 kB

About this dataset

Greece (GR): migration notes

Internal record of the P6 migration from the old scripts to the producer: the discrepancies found, their causes, and who decided what. This is a dated record, so the numbers are as of the migration and not kept current. It is not shipped in the zip.

  • Issue: pc-28e.8.9
  • Commit: worktree commit on top of c51b72a (see the commit P6 gr: SST producer; …)
  • Parity verdict: format-only (gate: pass, exit 0) against the live public CSV
  • Producer: custom, refresh disabled

Sources

InputURLNotes
Eurostat GISCO postal code point dataset 2025, CSV distributionhttps://gisco-services.ec.europa.eu/distribution/v2/pcode/csv/PCODE_PT_2025_4326.csvAll countries (~136 MB); the producer keeps CNTR_ID == 'EL'. CC BY-SA 4.0
  • The old build_postal_codes_product.py read a local sources/gisco_gr_filtered.csv. Its docstring names this URL as where that snapshot came from, so the producer fetches it.
  • The URL is year-versioned (PCODE_PT_2025_…). It stays pinned to 2025, the release live was built from. A newer GISCO year is a new file name, so moving to it is a deliberate change, not a refresh. Fetched 2026-10-05: 136,116,955 bytes, SHA-256 459efc82…, the same file as on 2026-10-02.
  • Python's default CA store fails GISCO's TLS chain on this machine, so the producer fetches with requests (certifi), as es does.

Parity against the live public CSV (2026-10-05)

Rows: 1,041 live and 1,041 fresh, none only on one side, 0 changed cells. The only difference is line endings: live is CRLF (the old csv.DictWriter default), the producer writes LF. With \r stripped, the fresh CSV is byte-identical to live. Covered by the standing sign-off (CRLF→LF only, equal rows, 0 changed cells).

Decisions

DecisionByBasis
Reconstruct the filter + NUTS lookup step inside the producerAgent; user accepted as a port (2026-10-05)The old builder's input was already filtered and enriched, and the step that did it was never committed. Its docstring describes the step ("derived here from NUTS3 code via a hardcoded, verified lookup"), and the source is the one it names, so this is treated as a port, not a new pipeline. The 13-region and 52-NUTS3 name tables were read off the live CSV (every code maps to exactly one name there) and equal the earlier, discarded reconstruction in 2b7224e. Parity confirms them: 0 changed cells.
Keep the two lookup tables inline in produce.pyAgent: port choiceSmall, stable classification; cz keeps its crosswalk inline the same way
Keep NSI_2021 raw in admin_code3, including 7-digit codes where GISCO dropped a leading zeroAgent: a faithful portThe old builder kept it raw; fixing it would change live data
Write LF line endingsStanding rule (CRLF→LF pre-approved)Same as every other producer
Old exact row-count assert dropped; structural checks kept as ProducerErrorBriefUnique 5-digit postal codes, known NUTS3, all 13 regions, non-empty LAU_NAME, 7–8 digit NSI_2021
Types: latitude/longitude number; accuracy stays string; codes stay string; primaryKey: [postal_code]Agent, from the produced CSVAll coordinate/accuracy cells are empty (GISCO's CSV has no geometry); unpopulated accuracy is string elsewhere too (au, nz). postal_code is unique and the producer enforces it
Counts removed from the descriptor description and README (row count, coverage %, the 27% pseudo-community share)Brief (doc rules)Region (13) and NUTS3 (52) counts kept as admin-unit counts

Transforms carried over

  • Keep CNTR_ID == 'EL'; postal_code = POSTCODE; place_name = LAU_NAME as GISCO spells it (no Greek accents).
  • admin_code2 = NUTS3_2024 with GISCO's literal quotes stripped; admin_name2 = English regional-unit name from the NUTS3 table.
  • admin_code1/admin_name1 = ISO 3166-2:GR letter and English region name from the NUTS2 prefix.
  • admin_code3 = raw NSI_2021; admin_name3, coordinates, accuracy and alternative_city_name empty.
  • Rows sorted by postal_code.

Not ported

  • The old builder's packaging (datapackage.json, README, ATTRIBUTION, zip) and publish_r2.py: build.py and the shared publisher own those now.

Open questions

  • Resolved (user, 2026-10-05): reconstructing the never-committed filter/lookup step counts as a port.
  • Resolved (orchestrator, 2026-10-05): removed the false "sample of the first 100 rows… contact sales" note from README.md (gr is free and its full CSV is public).
  • .licensing-notes.md and ATTRIBUTION-style text in it still carry historical counts (1,041 rows, 83%); left for the pc-hfz sweep.
  • 148 admin_code3 values are 7 digits because GISCO dropped a leading zero (e.g. 7010100 vs GISCO_2021 EL_07010100). Padding to 8 digits would be a data change; not done.