Energy usage trends by sector in Spain from 2010 to 2025
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.
- Eurostat dataset: Final energy consumption by sector
- Eurostat dataset: Complete energy balances
- Code Run 1
Images
spain_energy_sector_lines.svgspain_energy_sector_stacked.svgDataset filters for
ten00124Filter Value(s) geo ES siec TOTAL unit KTOE nrg_bal FC_E, FC_IND_E, FC_TRA_E, FC_OTH_HH_E, FC_OTH_CP_E sinceTimePeriod 2013 untilTimePeriod 2025 Dataset filters for
nrg_bal_cFilter Value(s) geo ES siec TOTAL unit KTOE nrg_bal FC_E, FC_IND_E, FC_TRA_E, FC_OTH_HH_E, FC_OTH_CP_E sinceTimePeriod 2010 untilTimePeriod 2012 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.") - Code Run 2
Dataset filters for
ten00124Filter Value(s) geo ES siec TOTAL unit KTOE nrg_bal FC_E, FC_IND_E, FC_TRA_E, FC_OTH_HH_E, FC_OTH_CP_E sinceTimePeriod 2013 untilTimePeriod 2025 Dataset filters for
nrg_bal_cFilter Value(s) geo ES siec TOTAL unit KTOE nrg_bal FC_E, FC_IND_E, FC_TRA_E, FC_OTH_HH_E, FC_OTH_CP_E sinceTimePeriod 2010 untilTimePeriod 2012 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.422Code
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())