DEV Community

Ancient Biotechnology
Ancient Biotechnology

Posted on

Data-Wrangling Ancient Texts: Building an Open Dataset of Genesis Lifespans and Sumerian Reigns

Most datasets start with an API or a database dump. This one started with ancient texts: Genesis 5 and 11, and the Sumerian King List. Both list people with huge numbers attached. Methuselah lives 969 years. Alulim of Eridu reigns for 28,800.

At Ancient Biotechnology we write about ancient texts. We wanted one machine-readable table that puts those numbers side by side, cites its sources and is honest about what it doesn't know. The result is the Ancient Lifespans Dataset: 38 rows, CC BY 4.0. Here is how we built it, including the parts that went wrong.

The scope

The CSV has four groups of rows:

  • 19 Genesis patriarchs, Adam to Terah (Genesis 5, 9:29 and 11)
  • 1 LXX-only row for Cainan II, who appears in the Septuagint but not in the Hebrew text
  • 8 antediluvian kings from the Sumerian King List (SKL)
  • 10 early postdiluvian kings, from Jushur of Kish to Ur-Nungal of Uruk

Schema design: one wide table, no forced merging

The first design question was whether to force the two traditions into one "years" column. We decided not to. A patriarch's lifespan and a king's reign are different quantities, and putting them in one column would hide that. Here are the columns:

name, tradition, text_source,
age_at_son_birth_MT, age_at_son_birth_LXX, age_at_son_birth_SP,
remaining_years_MT, remaining_years_LXX, remaining_years_SP,
total_lifespan_MT, total_lifespan_LXX, total_lifespan_SP,
reign_years, city, reference, notes
Enter fullscreen mode Exit fullscreen mode

Genesis rows fill the nine *_MT/_LXX/_SP columns and leave reign_years empty. SKL rows do the opposite and add city. Each row also carries:

  • a tradition label, such as Genesis 5 antediluvian or Sumerian King List - postdiluvian
  • a reference, such as Gen 5:3-5
  • free-text notes for manuscript variants

A long, tidy format (one row per person per tradition) would be more "correct". But a wide table is what people actually open in a spreadsheet, and it converts to long format with pd.melt in one line anyway.

Textual variants: three Genesis traditions

The numbers in Genesis 5 and 11 differ between the three main textual traditions:

  • Masoretic Text (MT). We checked it verse by verse against the KJV, which follows the MT.
  • Septuagint (LXX) and Samaritan Pentateuch (SP). These figures come from the comparison table in Wikipedia's Genealogies of Genesis, which cites Skinner's ICC Genesis (1930). Our LXX column follows the Lucianic recension, and other LXX manuscripts disagree. For example, some read 167 instead of 187 for Methuselah's age at his son's birth, so the README says so explicitly.

We followed one rule throughout: if a value couldn't be confirmed from a source we actually fetched, the cell stays blank. For example, LXX Cainan II has no numbers. An empty cell is more honest than a plausible-looking guess.

Sumerian reign lengths: keep what the source says

SKL reigns are transcribed from the ETCSL composite translation (c.2.1.1). Its numbers follow manuscript WB-444, and they are already given in years. In the cuneiform, these numbers are written in sexagesimal units. Alulim's 28,800 is 8 šar (8 × 3,600). We store the year values exactly as ETCSL gives them and don't re-derive them, so every number traces back to one published translation.

Other manuscripts disagree, and those readings go into notes rather than into extra columns:

  • Etana: 1,500 years in WB-444, 635 in ms. P2+L2
  • Dumuzid the fisherman: 100 in WB-444, 110 in ms. TL

Other king lists, such as WB-62 and Berossus, differ in names, numbers and even how many kings there are. We left them out entirely rather than mixing them in.

The encoding bug: when "š" became "c"

ETCSL uses an ASCII transliteration convention. c stands for š, and j stands for g̃. So Gilgameš shows up as Gilgamec, Jušur as Jucur, and Alalg̃ar as Alaljar.

Our first scrape took these strings literally. That gave us a table where Gilgamesh was named "Gilgamec", which looks like a typo to anyone outside Assyriology. The fix had two parts:

  1. name uses the conventional English spelling (Gilgamesh, Jushur, Alalgar, Meskiagkasher).
  2. notes keeps the raw ETCSL form, e.g. ETCSL ASCII spelling: Gilgamec., so anyone can match a row back to the source.

The lesson: when your source has its own transliteration scheme, decode it explicitly. Keep the raw form, and never let a lossy mapping quietly overwrite it. Save everything as UTF-8 too, or a library somewhere will mangle the diacritics for you.

Loading it with pandas

Here's a short script that compares the three Genesis traditions and sums the SKL reigns:

import pandas as pd

df = pd.read_csv("ancient_lifespans.csv")
gen = df[df.tradition.str.startswith("Genesis")].dropna(subset=["total_lifespan_MT"])
skl = df[df.tradition.str.startswith("Sumerian")]

print(gen[["total_lifespan_MT", "total_lifespan_LXX", "total_lifespan_SP"]].mean().round(1))

diff = gen[gen.total_lifespan_MT != gen.total_lifespan_SP][["name", "total_lifespan_MT", "total_lifespan_SP"]]
print(diff.to_string(index=False))

print(skl.groupby("tradition")["reign_years"].agg(["count", "sum", "median"]))
Enter fullscreen mode Exit fullscreen mode

Output:

total_lifespan_MT     609.0
total_lifespan_LXX    640.4
total_lifespan_SP     577.0
dtype: float64
      name  total_lifespan_MT  total_lifespan_SP
     Jared              962.0              847.0
Methuselah              969.0              720.0
    Lamech              777.0              653.0
      Eber              464.0              404.0
     Terah              205.0              145.0
                                   count       sum   median
tradition                                                  
Sumerian King List - antediluvian      8  241200.0  28800.0
Sumerian King List - postdiluvian     10    6425.0    522.5
Enter fullscreen mode Exit fullscreen mode

Two things stand out:

  • The Samaritan Pentateuch is the "shortest" tradition. Its patriarchs live 577 years on average, against 609 in the MT. The gap is concentrated in a few names. Methuselah alone loses 249 years.
  • Both traditions shrink after the Flood. The eight antediluvian kings reign 241,200 years in total, which matches the total ETCSL gives for WB-444. The ten postdiluvian kings reign 6,425 years combined, with a median of 522.5. By Gilgamesh (126) and his son Ur-Nungal (30), reigns are almost human-scale. The Genesis patriarchs show a similar drop after Noah. We explore that parallel in more depth in our article on the Sumerian King List and what it can and can't tell us.

Plotting the infographic

The numbers range from 30 to 43,200, so a linear axis is useless. A horizontal bar chart on a log scale does the job:

import matplotlib.pyplot as plt

g = gen.dropna(subset=["total_lifespan_MT"])
fig, (a1, a2) = plt.subplots(1, 2, figsize=(14, 8))
a1.barh(g.name, g.total_lifespan_MT, color="#8b5a2b")
a1.set_title("Genesis lifespans (MT)")
a2.barh(skl.name, skl.reign_years, color="#2b5a8b")
a2.set_xscale("log")
a2.set_title("Sumerian King List reigns (log scale)")
for ax in (a1, a2):
    ax.invert_yaxis()
fig.tight_layout()
fig.savefig("infographic.png", dpi=150)
Enter fullscreen mode Exit fullscreen mode

The dataset also ships with a ready-made infographic.png (and a Spanish infographic_es.png); the snippet above is a minimal version you can adapt.

License and where to get it

Everything is released under CC BY 4.0. Use it, remix it or put it in your classroom. Just credit "Ancient Biotechnology (2026), Ancient Lifespans Dataset". The download includes the CSV, an English and a Spanish README with full methodology and sources, and both infographics. It's mirrored on three platforms:

Takeaways for anyone digitizing old texts

  1. Model each variant as its own column instead of picking a "winner".
  2. Blank beats guessed. Record what you couldn't verify.
  3. Cite at the row level. Every row has a verse or manuscript reference.
  4. Decode transliteration schemes explicitly and keep the raw form.
  5. Don't silently convert units. Store what the source says and document the system behind it.

If you build something on top of the dataset, such as a long-format version, an added Berossus column or a better visualization, we'd love to see it. You can find more of our writing on ancient texts at Ancient Biotechnology.

Top comments (0)