How to Measure How Long Volcanic Eruptions Last
On this page
Problem statement
Some eruptions are over in an afternoon; Stromboli has been erupting since 1934. The Smithsonian's eruption table has a start and an end date for most eruptions, so durations can be measured, but three things stand in the way: months and days of 0 where only the year is known, a placeholder date for eruptions known only to the year, and end dates that are not ends at all, marked with > because the eruption was still going when last reported. Treated naively, a continuing eruption looks finished and an eruption known to the year looks a few months long. This page builds start and end dates that keep those meanings, and measures eruptions since 1900.
Quick answer
Build dates only where year, month and day are all known, and keep the > flag as "still going":
def date(df, side):
y, m, d = df[f"{side}DateYear"], df[f"{side}DateMonth"], df[f"{side}DateDay"]
known = y.notna() & (m > 0) & (d > 0) & (df[f"{side}DateDayUncertainty"].fillna(0) < 182)
return pd.to_datetime(pd.DataFrame({"year": y, "month": m, "day": d}).where(known), errors="coerce")
e = eru[(eru.Activity_Type == "Confirmed Eruption") & (eru.StartDateYear >= 1900)].copy()
e["start"], e["end"] = date(e, "Start"), date(e, "End")
e["going"] = e.EndDateYearModifier.eq(">")
e["days"] = (e.end - e.start).dt.days
done = e[e.days.notna() & ~e.going]
print(f"eruptions since 1900: {len(e):,}; with exact start and end: {len(done):,}; continuing: {e.going.sum()}")
print(done.days.describe(percentiles=[0.25, 0.5, 0.75, 0.9]).round(0).loc[["25%", "50%", "75%", "90%", "max"]].to_string())
eruptions since 1900: 3,904; with exact start and end: 2,943; continuing: 39
25% 5.0
50% 49.0
75% 171.0
90% 496.0
max 27965.0
Of 3,904 confirmed eruptions since 1900, 2,943 have an exact start and end and are finished. Half of them lasted 49 days or less, a quarter 5 days or less, and one in ten more than 496 days. The longest finished eruption lasted 27,965 days, 76.6 years: Sangay in Ecuador, from 1934 to 2011. A further 39 are continuing.
Dates that are not dates
1. What gets dropped
print(f"start month or day 0: {((e.StartDateMonth == 0) | (e.StartDateDay == 0)).sum()}; start known only to the year (2 July, Β±182 days): {(e.StartDateDayUncertainty == 182).sum()}")
print(f"no end year: {e.EndDateYear.isna().sum()}")
start month or day 0: 0; start known only to the year (2 July, Β±182 days): 341
no end year: 825
Since 1900 no eruption has a start month or day of 0, but 341 start on the 2 July placeholder and are known only to the year. 825 have no end year at all, often short eruptions whose end nobody recorded. Both are left out of the durations, which therefore describe the better-documented eruptions.
2. Continuing eruptions
g = e[e.going].assign(years=lambda d: (d.end - d.start).dt.days / 365.25).sort_values("years", ascending=False)
print(g[["Volcano_Name", "start", "end", "years"]].head(6).round(1).to_string(index=False))
Volcano_Name start end years
Santa Maria 1922-06-22 2026-03-18 103.7
Dukono 1933-08-13 2026-03-16 92.6
Stromboli 1934-02-02 2026-03-31 92.2
Erebus 1972-12-16 2026-03-17 53.2
Sheveluch 1999-08-15 2026-03-25 26.6
Bagana 2000-02-28 2026-03-17 26.0
Santa MarΓa in Guatemala has been erupting from its lava dome Santiaguito since 1922, 103.7 years at the last report, longer than Dukono in Indonesia and Stromboli. All of these end dates fall in March 2026 with a > flag: the end is only the date of the last report the copy includes.
The end date of a continuing eruption is the date of the last report, so its duration is a minimum.
Duration and explosivity
The data used on this page
The Smithsonian Institution Global Volcanism Program's Volcanoes of the World database (version 5.3 is cited as doi:10.5479/si.GVP.VOTW5-2025.5.3): its Holocene volcano and eruption tables, read from the program's WFS service on 19 October 2026 and saved on this site, because the database is edited as eruptions are reported.
from pathlib import Path
import zipfile
import geopandas as gpd
import numpy as np
import pandas as pd
import requests
Path("data").mkdir(exist_ok=True)
# Smithsonian Global Volcanism Program, Volcanoes of the World: Holocene volcanoes, Holocene eruptions and Pleistocene
# volcanoes as GeoJSON from its WFS service, with Natural Earth's populated places and 1:110m countries.
# Saved 19 October 2026, because the database is edited as eruptions are reported.
# Live: https://webservices.volcano.si.edu/geoserver/GVP-VOTW/ows?service=WFS&version=2.0.0&request=GetFeature
# &outputFormat=json&typeName=GVP-VOTW:Smithsonian_VOTW_Holocene_Volcanoes (and ..._Holocene_Eruptions)
ARCHIVE = "gvp-votw-2026-10-19.zip"
if not Path(f"data/{ARCHIVE}").exists():
Path(f"data/{ARCHIVE}").write_bytes(requests.get(f"https://data.spatialworkflow.io/{ARCHIVE}", timeout=600).content)
Z = zipfile.ZipFile(f"data/{ARCHIVE}")
vol = gpd.read_file(Z.open("Smithsonian_VOTW_Holocene_Volcanoes.json"))
eru = gpd.read_file(Z.open("Smithsonian_VOTW_Holocene_Eruptions.json"))
print(f"Volcanoes of the World: {len(vol):,} Holocene volcanoes, {len(eru):,} eruptions")
Volcanoes of the World: 1,214 Holocene volcanoes, 11,089 eruptions
Example 1: by VEI
print(done.groupby(done.ExplosivityIndexMax.fillna(-1).astype(int)).days.agg(["size", "median"]).rename(index={-1: "none"}).to_string())
size median
ExplosivityIndexMax
none 14 13.0
0 239 20.0
1 860 15.0
2 1338 61.0
3 406 123.0
4 75 55.0
5 8 244.5
6 3 132.0
Duration rises with explosivity up to VEI 3, from a median of 15 to 20 days for VEI 0 and 1 to 123 days for VEI 3. Beyond that the groups are small, 75 eruptions of VEI 4 and 8 of VEI 5, and the medians are not reliable. A larger eruption is not necessarily a longer one: Pinatubo's climax lasted hours within an eruption of a few months.
Example 2: one day or less
print(f"over within a day: {(done.days <= 1).mean():.1%}; longer than a year: {(done.days > 365).mean():.1%}")
over within a day: 19.1%; longer than a year: 13.6%
One finished eruption in five, 19.1%, was over within a day, and 13.6% lasted more than a year. Volcanic eruptions are mostly brief, with a long tail of eruptions that last for decades.
Internal links
- Eruption dates β the month 0 and 2 July codes in detail
- Eruptions by explosivity β the index in Example 1
- Countries with erupting volcanoes β where the long eruptions are
- Reading the database β the eruption table