Data source : https://ads.nipr.ac.jp/vishop/#/extent
REGION SELECTOR = Antarctic
At the bottom of the page : Download the sea ice extent (CSV file) - seasonal dataset

From the National Institute of Polar Research (Japan) website:

The sea-ice extent is calculated as the areal sum of sea ice covering the ocean where sea-ice concentration [SIC] exceeds a threshold [15% for AMSR-E]. SICs are derived from various satellite-borne passive microwave radiometer [PMR] sensors using the algorithm developed and provided by Dr. Comiso of NASA GSFC through a cooperative relationship between NASA and JAXA. The following sensor's data were used;
• Jan. 1980 ~ Jul. 1987 : SMMR
• Jul. 1987 ~ Jun. 2002 : SSM/I
• Jun. 2002 ~ Oct. 2011 : AMSR-E
• Oct. 2011 ~ Jul. 2012 : WindSat
• Jul. 2012 ~ the present : AMSR2

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.style.use("fivethirtyeight")
CSV_FILE_PATH = "./VISHOP_EXTENT_GRAPH_Antarctic.csv"
FS = (12, 7)  # figure size

Load the Data

df = pd.read_csv(CSV_FILE_PATH)
df.head(3)
#nummonthdate...202120222023
0011...6568300.05778923.04777328.0
1112...6451907.05570948.04644691.0
2213...6325097.05411740.04485865.0

3 rows × 54 columns

We remove columns that are not specific years [#num, month, date, time[second], 1980's Average, ...]

cols = df.columns
cols = [c for c in cols if (len(c) == 4) and c.isnumeric() and (c.startswith("19") or c.startswith("20"))]
df = df[cols]
df = df.astype(float)
df = df.replace(-9999.0, np.nan)
df.head(3)
197819791980...202120222023
0NaNNaN5966499.0...6568300.05778923.04777328.0
1NaN6988174.0NaN...6451907.05570948.04644691.0
2NaNNaN5855460.0...6325097.05411740.04485865.0

3 rows × 46 columns

Non-leap years

The dataframe columns correspond to years and rows to [month , day] combinations. Thus, February 29th has missing values on non-leap years. We shift the values on these years in order to have a day-of-year row index without missing values on the 29th of February:

df.iloc[58:61][[str(y) for y in range(2014, 2024)]]
201420152016...202120222023
583753923.03800984.02857127.0...3197871.02211479.02063912.0
59NaNNaN2853039.0...NaNNaNNaN
603772864.03807337.02863943.0...3336462.02231068.02095439.0
for year in range(1978, 2024):
    if (year - 1972) % 4 != 0:
        year_str = str(year)
        if year_str in df:
            df.loc[59:365, year_str] = df.loc[59:365, year_str].shift(-1)
df.iloc[58:61][[str(y) for y in range(2014, 2024)]]
201420152016...202120222023
583753923.03800984.02857127.0...3197871.02211479.02063912.0
593772864.03807337.02853039.0...3336462.02231068.02095439.0
603805451.03803617.02863943.0...3474391.02263092.02095754.0

Long time range daily mean

year_start = 1978
year_end = 2012
current_year = 2023
df[f"{year_start}-{year_end} mean"] = df[
    [str(y) for y in range(year_start, year_end + 1)]
].mean(axis=1)

Figure

alpha_1 = 0.2
color_1 = "silver"
alpha_2 = 0.4
color_2 = "grey"
color_3 = "black"
ax = (df[f"{year_start}"] - df[f"{year_start}-{year_end} mean"]).plot(
    figsize=FS, color=color_1, alpha=alpha_1
)
for year in [str(y) for y in range(year_start + 1, year_end)]:
    ax = (df[year] - df[f"{year_start}-{year_end} mean"]).plot(
        ax=ax, color=color_1, alpha=alpha_1
    )
ax = (df[f"{year_end}"] - df[f"{year_start}-{year_end} mean"]).plot(
    ax=ax, color=color_1, label=f"{year_start}-{year_end}", alpha=alpha_1
)
ax = (df[f"{year_end+1}"] - df[f"{year_start}-{year_end} mean"]).plot(
    ax=ax, color=color_2, alpha=alpha_2
)
for year in [str(y) for y in range(year_end + 2, current_year - 1)]:
    ax = (df[year] - df[f"{year_start}-{year_end} mean"]).plot(
        ax=ax, color=color_2, alpha=alpha_2
    )
ax = (df[f"{current_year-1}"] - df[f"{year_start}-{year_end} mean"]).plot(
    ax=ax, color=color_2, label=f"{year_end+1}-{current_year-1}", alpha=alpha_2
)
ax = (df[f"{current_year}"] - df[f"{year_start}-{year_end} mean"]).plot(
    ax=ax, color=color_3, label=f"{current_year}", alpha=1.0
)
plt.hlines(y = 0, xmin = 0, xmax = 365, alpha=0.7, linewidth=0.5)
_ = ax.set_ylim(-3e6, +3e6)
_ = ax.legend()
_ = ax.set(
    title=f"Antarctic sea ice extent anomaly \n w.r.t. {year_start}-{year_end} mean",
    xlabel="Day of year",
    ylabel="Sea ice extent anomaly (million $km^2$)",
)

output_13_0