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.

Histogram of eruption durations on a log axis from one day to 100 years, peaking between a week and a few months, with a median of 49 days. Histogram of eruption durations on a log axis from one day to 100 years, peaking between a week and a few months, with a median of 49 days.
How long finished eruptions since 1900 lasted.

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.

Horizontal bars from start to last report for twelve continuing eruptions: Santa MarΓ­a since 1922, Dukono and Stromboli since the 1930s, Erebus since 1972, the rest since about 2000. Horizontal bars from start to last report for twelve continuing eruptions: Santa MarΓ­a since 1922, Dukono and Stromboli since the 1930s, Erebus since 1972, the rest since about 2000.
The longest continuing eruptions.

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.

Box plots of duration by VEI from 0 to 4 on a log axis: medians from about two weeks at VEI 0 and 1 to about four months at VEI 3. Box plots of duration by VEI from 0 to 4 on a log axis: medians from about two weeks at VEI 0 and 1 to about four months at VEI 3.
Duration by explosivity.

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.