Energy usage trends by sector in Spain from 2010 to 2025

Model: Kimi K2.6 Checked on:

Spain’s final energy consumption by sector shows a clear downward trend in total demand alongside a shift in sectoral shares from 2010 to 2024. Data for 2025 are not yet available in Eurostat12.

Overall trend

Total final energy use in Spain fell from about 85,500 thousand tonnes of oil equivalent (KTOE) in 2010 to roughly 79,800 KTOE in 2024, a decline of 6.7%3. All major sectors except commercial and public services saw lower consumption in 2024 than in 2010.

Sectoral breakdown

Sector 2010 (KTOE) 2024 (KTOE) Change (%)
Transport 34,259 32,870 –4.1
Industry 20,800 19,093 –8.2
Households 16,952 13,880 –18.1
Commercial & public services 9,780 11,082 +13.3
Other sectors (residual) 3,708 2,851 –23.1

Transport remains the largest consumer, accounting for roughly 40% of the total throughout the period. After a steady drop from 2010 to 2013, transport demand rebounded and plateaued in the late 2010s, before collapsing to 26,059 KTOE in 2020 during the pandemic, then recovering to near-pre-pandemic levels by 20243.

Industry followed a broadly similar trajectory, declining from ~20,800 KTOE in 2010 to a low of ~19,100 KTOE in 2022–2024, with a noticeable dip in 20204.

Households show the most consistent downward trend, falling from ~16,950 KTOE in 2010 to ~13,880 KTOE in 2024. This decrease likely reflects efficiency improvements, climate conditions, and demographic shifts4.

Commercial and public services is the only major category to grow, rising from ~9,800 KTOE in 2010 to ~11,100 KTOE in 2024, increasing its share of total final consumption from 11.4% to 13.9%3.

The “Other sectors” residual (mainly agriculture, forestry, fishing, and minor non-energy uses) shrank from ~3,700 KTOE in 2010 to ~2,850 KTOE in 20244.

Visual summary

The line chart and stacked area chart generated during the analysis illustrate these trends clearly, showing the 2020 demand shock across all sectors and the steady rise of commercial services relative to the declining household share4.

Note: Energy consumption data are reported in thousand tonnes of oil equivalent (KTOE) for all fuels aggregated (siec=TOTAL). Agriculture and forestry are not reported separately for Spain in the available tables; they are included in the “Other sectors” residual.

  1. Eurostat dataset: Final energy consumption by sector
  2. Eurostat dataset: Complete energy balances
  3. Dataset: ten00124 Dataset: nrg_bal_c

    Images

    spain_energy_sector_lines.svg
    spain_energy_sector_stacked.svg

    Dataset filters for ten00124

    FilterValue(s)
    geoES
    siecTOTAL
    unitKTOE
    nrg_balFC_E, FC_IND_E, FC_TRA_E, FC_OTH_HH_E, FC_OTH_CP_E
    sinceTimePeriod2013
    untilTimePeriod2025

    Dataset filters for nrg_bal_c

    FilterValue(s)
    geoES
    siecTOTAL
    unitKTOE
    nrg_balFC_E, FC_IND_E, FC_TRA_E, FC_OTH_HH_E, FC_OTH_CP_E
    sinceTimePeriod2010
    untilTimePeriod2012

    Program output

    nrg_bal       FC_E  SUM_SECTORS  RESIDUAL
    time                                     
    2010     85499.587    81791.227  3708.360
    2011     82390.536    78968.253  3422.283
    2012     78999.665    75549.259  3450.406
    2013     76055.579    72370.573  3685.006
    2014     75143.582    71469.097  3674.485
    2015     76669.118    73645.263  3023.855
    2016     78375.479    75447.695  2927.784
    2017     80418.551    77408.978  3009.573
    2018     82275.356    79242.202  3033.154
    2019     82204.334    79055.051  3149.283
    2020     73117.836    69819.192  3298.644
    2021     79280.131    76021.717  3258.414
    2022     78882.862    75768.178  3114.684
    2023     77903.440    75020.926  2882.514
    2024     79776.408    76925.061  2851.347
    
    Sector data (KTOE):
           Industry  Transport  ...  Commercial & Public Services  Other Sectors
    time                        ...                                             
    2010  20799.576  34259.422  ...                      9780.398       3708.360
    2011  20637.194  32475.680  ...                     10221.484       3422.283
    2012  20116.469  29798.111  ...                     10104.210       3450.406
    2013  19610.466  28203.413  ...                      9667.769       3685.006
    2014  19320.720  28427.130  ...                      8933.937       3674.485
    2015  19424.018  29439.410  ...                      9511.993       3023.855
    2016  20653.448  30631.963  ...                      9830.589       2927.784
    2017  21134.634  31749.555  ...                     10132.767       3009.573
    2018  21262.424  32513.600  ...                     10287.346       3033.154
    2019  21348.181  32915.106  ...                     10346.442       3149.283
    2020  19646.016  26059.067  ...                      9558.346       3298.644
    2021  20972.534  30350.056  ...                     10185.375       3258.414
    2022  19083.933  32477.593  ...                     10190.443       3114.684
    2023  18814.009  32202.670  ...                     10333.038       2882.514
    2024  19093.126  32870.130  ...                     11081.821       2851.347
    
    [15 rows x 5 columns]
    
    Percentage change 2010-2024:
    Industry                        -8.2
    Transport                       -4.1
    Households                     -18.1
    Commercial & Public Services    13.3
    Other Sectors                  -23.1
    dtype: float64
    
    Charts saved.
    

    Code

    import pandas as pd
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Load both datasets
    df1 = pd.read_csv(DATASET_FILE0)
    df2 = pd.read_csv(DATASET_FILE1)
    df = pd.concat([df1, df2], ignore_index=True)
    
    # Pivot
    df_pivot = df.pivot_table(index='time', columns='nrg_bal', values='value', aggfunc='sum')
    
    # Check residual
    df_pivot['SUM_SECTORS'] = df_pivot['FC_IND_E'] + df_pivot['FC_TRA_E'] + df_pivot['FC_OTH_HH_E'] + df_pivot['FC_OTH_CP_E']
    df_pivot['RESIDUAL'] = df_pivot['FC_E'] - df_pivot['SUM_SECTORS']
    print(df_pivot[['FC_E', 'SUM_SECTORS', 'RESIDUAL']])
    
    # The residual likely includes agriculture, forestry, fishing, and other not elsewhere specified
    # Let's rename columns for plotting
    sector_data = df_pivot[['FC_IND_E', 'FC_TRA_E', 'FC_OTH_HH_E', 'FC_OTH_CP_E']].copy()
    sector_data.columns = ['Industry', 'Transport', 'Households', 'Commercial & Public Services']
    # Add residual as 'Other sectors'
    sector_data['Other Sectors'] = df_pivot['RESIDUAL']
    
    print("\nSector data (KTOE):")
    print(sector_data)
    
    # Calculate percentage changes from 2010 to 2024
    pct_change = ((sector_data.loc[2024] - sector_data.loc[2010]) / sector_data.loc[2010] * 100).round(1)
    print("\nPercentage change 2010-2024:")
    print(pct_change)
    
    # Create line chart
    plt.figure(figsize=(10, 6))
    for col in sector_data.columns:
        if col != 'Other Sectors':
            plt.plot(sector_data.index, sector_data[col], marker='o', label=col, linewidth=2)
    
    plt.title('Spain: Final Energy Consumption by Sector (2010–2024)')
    plt.xlabel('Year')
    plt.ylabel('Thousand Tonnes of Oil Equivalent (KTOE)')
    plt.legend()
    plt.grid(True, alpha=0.3)
    plt.tight_layout()
    plt.savefig('spain_energy_sector_lines.svg', format='svg')
    plt.close()
    
    # Create stacked area chart
    plt.figure(figsize=(10, 6))
    plt.stackplot(sector_data.index, 
                  sector_data['Industry'], 
                  sector_data['Transport'], 
                  sector_data['Households'], 
                  sector_data['Commercial & Public Services'],
                  sector_data['Other Sectors'],
                  labels=['Industry', 'Transport', 'Households', 'Commercial & Public Services', 'Other Sectors'],
                  alpha=0.8)
    plt.title('Spain: Final Energy Consumption by Sector (Stacked, 2010–2024)')
    plt.xlabel('Year')
    plt.ylabel('Thousand Tonnes of Oil Equivalent (KTOE)')
    plt.legend(loc='upper left', reverse=True)
    plt.tight_layout()
    plt.savefig('spain_energy_sector_stacked.svg', format='svg')
    plt.close()
    
    print("\nCharts saved.")
    
  4. Dataset: ten00124 Dataset: nrg_bal_c

    Dataset filters for ten00124

    FilterValue(s)
    geoES
    siecTOTAL
    unitKTOE
    nrg_balFC_E, FC_IND_E, FC_TRA_E, FC_OTH_HH_E, FC_OTH_CP_E
    sinceTimePeriod2013
    untilTimePeriod2025

    Dataset filters for nrg_bal_c

    FilterValue(s)
    geoES
    siecTOTAL
    unitKTOE
    nrg_balFC_E, FC_IND_E, FC_TRA_E, FC_OTH_HH_E, FC_OTH_CP_E
    sinceTimePeriod2010
    untilTimePeriod2012

    Program output

    Total 2010: 85499.587
    Total 2024: 79776.408
    Total change: -6.7
    
    Transport share 2010: 40.1
    Transport share 2024: 41.2
    
    Households share 2010: 19.8
    Households share 2024: 17.4
    
    Industry share 2010: 24.3
    Industry share 2024: 23.9
    
    Commercial share 2010: 11.4
    Commercial share 2024: 13.9
    
    2020 values:
    nrg_bal
    FC_E           73117.836
    FC_IND_E       19646.016
    FC_OTH_CP_E     9558.346
    FC_OTH_HH_E    14555.763
    FC_TRA_E       26059.067
    Name: 2020, dtype: float64
    
    Transport lowest year: 2020 26059.067
    Transport highest year: 2010 34259.422
    

    Code

    import pandas as pd
    
    df1 = pd.read_csv(DATASET_FILE0)
    df2 = pd.read_csv(DATASET_FILE1)
    df = pd.concat([df1, df2], ignore_index=True)
    
    df_pivot = df.pivot_table(index='time', columns='nrg_bal', values='value', aggfunc='sum')
    
    # Calculate some specific stats
    print("Total 2010:", df_pivot.loc[2010, 'FC_E'])
    print("Total 2024:", df_pivot.loc[2024, 'FC_E'])
    print("Total change:", round((df_pivot.loc[2024, 'FC_E'] - df_pivot.loc[2010, 'FC_E']) / df_pivot.loc[2010, 'FC_E'] * 100, 1))
    
    print("\nTransport share 2010:", round(df_pivot.loc[2010, 'FC_TRA_E'] / df_pivot.loc[2010, 'FC_E'] * 100, 1))
    print("Transport share 2024:", round(df_pivot.loc[2024, 'FC_TRA_E'] / df_pivot.loc[2024, 'FC_E'] * 100, 1))
    
    print("\nHouseholds share 2010:", round(df_pivot.loc[2010, 'FC_OTH_HH_E'] / df_pivot.loc[2010, 'FC_E'] * 100, 1))
    print("Households share 2024:", round(df_pivot.loc[2024, 'FC_OTH_HH_E'] / df_pivot.loc[2024, 'FC_E'] * 100, 1))
    
    print("\nIndustry share 2010:", round(df_pivot.loc[2010, 'FC_IND_E'] / df_pivot.loc[2010, 'FC_E'] * 100, 1))
    print("Industry share 2024:", round(df_pivot.loc[2024, 'FC_IND_E'] / df_pivot.loc[2024, 'FC_E'] * 100, 1))
    
    print("\nCommercial share 2010:", round(df_pivot.loc[2010, 'FC_OTH_CP_E'] / df_pivot.loc[2010, 'FC_E'] * 100, 1))
    print("Commercial share 2024:", round(df_pivot.loc[2024, 'FC_OTH_CP_E'] / df_pivot.loc[2024, 'FC_E'] * 100, 1))
    
    # Show the dip in 2020
    print("\n2020 values:")
    print(df_pivot.loc[2020])
    
    # Show lowest transport year
    print("\nTransport lowest year:", df_pivot['FC_TRA_E'].idxmin(), df_pivot['FC_TRA_E'].min())
    print("Transport highest year:", df_pivot['FC_TRA_E'].idxmax(), df_pivot['FC_TRA_E'].max())