Skip to main content

🏛️ Chinese History Toolkits

Map any year to its Chinese dynasty / reign-era / epoch — and back.

English · 中文 · Online Docs

Python License Docs Tests Doc coverage


A typed, dependency-light Python API for Chinese historical chronology: look up any 年号 / 朝代 / 历史时期 by name or by year, from the Paleolithic through 清.

✨ Features

  • 🔁 Two-way lookup — name → (begin, end) years; year → list of all parallel polities.
  • 🪨 Full timeline — 旧石器 / 新石器 prehistoric brackets through 清.
  • 📚 Selectable chronology — 上古 dating is contested scholarship, so pick the source you trust: 上海图书馆, 夏商周断代工程, or 万国鼎《中国历史纪年表》.
  • 🧭 Disambiguated — reused names resolve correctly (夏(窦建德) ≠ 上古 ), and an ambiguous 年号 raises rather than guessing.
  • 🌐 Alias-friendly — pass aliases={"新石器": {"Neolithic", "Neo"}} to accept foreign-language input.
  • Lightweight — only pandas at runtime; data ships with the package, no network needed.

🚀 Quickstart

# From PyPI — distribution name is `chinese_history_toolkits`
pip install chinese_history_toolkits

# Or from source
git clone https://github.com/SongshGeoLab/chinese_history_toolkits.git
cd chinese_history_toolkits
uv sync --all-extras

Note — the PyPI distribution name is chinese_history_toolkits (verbose), but the import name is the short acronym chhiskit for daily use.

import chhiskit

# Name → years
chhiskit.get_age_from_cultural_period("康熙")                              # → (1662.0, 1722.0)
chhiskit.get_age_from_cultural_period("唐", level="dynasty")               # → (618.0, 907.0)
chhiskit.get_age_from_cultural_period("新石器", level="epoch")             # → (-10000.0, -2070.0)

# Year → matching polities (multiple are normal — 三国, 隋末, etc.)
[m.dynasty_id for m in chhiskit.get_cultural_periods_from_year(250)]
# → ['三国', '吴', '蜀', '魏']

# BP convention (radiocarbon, 1950 reference)
chhiskit.get_age_from_cultural_period("商", level="dynasty", anno_domini=False)
# → (3550.0, 2996.0)

# Foreign aliases
chhiskit.get_age_from_cultural_period(
    "Neolithic", level="epoch",
    aliases={"新石器": {"Neolithic", "Neo"}},
)
# → (-10000.0, -2070.0)

📚 Choosing a chronology

Scholars disagree about 上古 dating — the disagreement is real scholarship, not data error — so this library lets you pick rather than deciding for you:

chhiskit.get_age_from_cultural_period("夏", level="epoch")                 # → (-2070.0, ...)  夏商周断代工程 (default)
chhiskit.get_age_from_cultural_period("夏", level="epoch", source="shl")   # → (-1989.0, ...)  上海图书馆
chhiskit.get_age_from_cultural_period("夏", level="epoch", source="wgd")   # → (-2100.0, ...)  万国鼎 1956

chhiskit.set_default_source("shl")   # or set a preference once
chhiskit.list_sources()              # what each source covers

Sources overlay the base table and fall back to it where they are silent, so asking a source for something it never covered warns you rather than quietly handing you someone else's numbers. See Chronology Sources.

📖 Documentation

📖 Quick Start Install + first lookup, 5 minutes
📚 API Reference Every parameter, with worked examples
🗺️ Epochs Reference EPOCH_MAP + PREHISTORIC_EPOCHS
🕰️ Chronology Sources Which source says what, and how to pick

Build the site locally:

make docs       # serve at http://127.0.0.1:8000
make docs-build # static build

🧪 Development

make test                       # pytest
pre-commit run --all-files      # black + ruff + flake8 + mypy + interrogate
make tox                        # Python 3.10–3.13 matrix

The test file tests/test_dynasties.py is the executable spec — 125 cases organized into one class per behavior cluster, each with a docstring explaining what it pins.

How the shipped data is produced, audited and regenerated is documented for maintainers in data/dynasties/readme.md.

📄 Data attribution

Source Used for
上海图书馆开放数据平台 Base table — 朝代 / 年号 / 帝王
夏商周断代工程 (2000) 上古 chronology (source="xsz", default)
万国鼎《中国历史纪年表》(中华书局, 1956) 国号 / 朝代 spans (source="wgd")

Every modification to the upstream data is recorded row-by-row in dynasty_drops.md, each with a link back to the source record.

🤝 Contributing

PRs welcome. Please:

  1. Run pre-commit run --all-files and make test (must pass).
  2. New behavior → new test in tests/test_dynasties.py with a docstring describing what it pins.
  3. Touching the data? See data/dynasties/readme.md — regenerated artifacts are committed alongside the change so the diff is its own audit trail.

📜 License

MIT — see LICENSE.

👤 Author

SongshGeo · GitHub · Website

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

chinese_history_toolkits-0.2.0.tar.gz (235.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

chinese_history_toolkits-0.2.0-py3-none-any.whl (45.5 kB view details)

Uploaded Python 3

File details

Details for the file chinese_history_toolkits-0.2.0.tar.gz.

File metadata

  • Download URL: chinese_history_toolkits-0.2.0.tar.gz
  • Upload date:
  • Size: 235.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for chinese_history_toolkits-0.2.0.tar.gz
Algorithm Hash digest
SHA256 8ff09a7a6b003bfae1264dbe574f0584ed31db0665b603db41f2b1c125f5f47a
MD5 85d05243140a7c7463ff1b28dec5ef4b
BLAKE2b-256 87ae39db0ed53196959d3d93c3a220ce1635943a2e7d706f1e1259c8559fecb1

See more details on using hashes here.

File details

Details for the file chinese_history_toolkits-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: chinese_history_toolkits-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 45.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for chinese_history_toolkits-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 76c939aa1dcbac473f9b420162dff9acf4ecae7d152ef2275499ab0b5f6da9cf
MD5 64d611ef96efc00bd5ce13db9f29fdba
BLAKE2b-256 a729e3dc57fc56521e0475ba0fbbea843738b48dd010947a6efc37f56bffae75

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 files

0.1.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page