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
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
traditionlabel, such asGenesis 5 antediluvianorSumerian King List - postdiluvian - a
reference, such asGen 5:3-5 - free-text
notesfor 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:
-
nameuses the conventional English spelling (Gilgamesh, Jushur, Alalgar, Meskiagkasher). -
noteskeeps 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"]))
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
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)
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:
- Kaggle: https://www.kaggle.com/datasets/ancientbiotechnology/ancient-lifespans-genesis-vs-sumerian-king-list
- OSF: https://osf.io/b9n8v/
- Internet Archive: https://archive.org/details/ancient-lifespans
Takeaways for anyone digitizing old texts
- Model each variant as its own column instead of picking a "winner".
- Blank beats guessed. Record what you couldn't verify.
- Cite at the row level. Every row has a verse or manuscript reference.
- Decode transliteration schemes explicitly and keep the raw form.
- 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)