Russian oil exports to European countries in 2025, by destination country

Model: DeepSeek V4.1 Flash Checked on:

Russian oil exports to European countries in 2025

Using Eurostat's monthly "Oil and petroleum products imports" statistics (reported imports by the receiving country from Russia — the mirror image of Russian exports)1, here is the 2025 breakdown by destination country, in thousand tonnes (total oil & petroleum products, category O4000):

Destination country Crude oil Refined products Other oil* Total
Türkiye 15,229.3 16,776.7 45.8 32,051.8
Slovakia 4,922.9 0.3 0.0 4,923.2
Hungary 3,762.0 0.0 0.0 3,762.0
Netherlands 0.0 0.0 1,715.5 1,715.5
Georgia 225.3 846.6 0.0 1,071.8
Czechia 527.0 0.0 0.0 527.0
Croatia 0.0 0.0 423.4 423.4
Poland 0.0 294.7 0.0 294.7
France 0.0 0.0 29.0 29.0
Finland 0.0 15.0 0.0 15.0
Germany 7.9 0.0 0.0 7.9
Lithuania 0.0 6.7 0.0 6.7
Latvia 0.0 2.7 0.0 2.7
Moldova 0.0 0.4 0.0 0.4
North Macedonia 0.0 0.1 0.0 0.1
Total (listed) 24,674.4 17,943.2 2,213.7 44,831.3

*"Other oil" = NGL, refinery feedstocks, additives and other hydrocarbons (reported under O4000 but not in the crude-oil or refined-product sub-totals).

All other European reporters in the dataset (Belgium, Austria, Spain, Italy, Ireland, Cyprus, Bulgaria, Denmark, Estonia, Greece, Montenegro, Norway, Malta, Luxembourg, Portugal, Serbia, Romania, Slovenia, Sweden, Albania) recorded zero imports of Russian oil in 2025.

Key points

The accompanying chart (generated in 2) shows these flows as a horizontal bar chart, broken down by crude oil, refined products and other oil.

Caveats: figures are volumes (thousand tonnes) reported by importing countries in Eurostat energy statistics; value (€) data are not reported for Russian partners. The dataset covers EU countries plus a set of neighbouring European economies (e.g. Türkiye, Georgia, Moldova, Western Balkan countries, Norway) — a few other European destinations outside Eurostat's coverage would not appear.

  1. Eurostat dataset: Oil and petroleum products imports - monthly data
  2. Dataset: nrg_ti_oilm

    Images

    russian_oil_2025.svg

    Dataset filters for nrg_ti_oilm

    FilterValue(s)
    partnerRU
    siecO4000, O4100_TOT, O4600
    unitTHS_T
    sinceTimePeriod2025-01
    untilTimePeriod2025-12

    Program output

    saved
    siec  O4100_TOT    O4600   other    O4000
    geo                                      
    TR      15229.3  16776.7    45.8  32051.8
    SK       4922.9      0.3     0.0   4923.2
    HU       3762.0      0.0     0.0   3762.0
    NL          0.0      0.0  1715.5   1715.5
    GE        225.3    846.6     0.0   1071.8
    CZ        527.0      0.0     0.0    527.0
    HR          0.0      0.0   423.4    423.4
    PL          0.0    294.7     0.0    294.7
    FR          0.0      0.0    29.0     29.0
    FI          0.0     15.0     0.0     15.0
    DE          7.9      0.0     0.0      7.9
    LT          0.0      6.7     0.0      6.7
    LV          0.0      2.7     0.0      2.7
    MD          0.0      0.4     0.0      0.4
    MK          0.0      0.1     0.0      0.1
    

    Code

    
    import pandas as pd, numpy as np
    import matplotlib
    matplotlib.use('Agg')
    import matplotlib.pyplot as plt
    
    df = pd.read_csv(DATASET_FILE, dtype=str)
    df['value'] = pd.to_numeric(df['value'], errors='coerce')
    df = df.dropna(subset=['value'])
    agg = df.groupby(['geo','siec'])['value'].sum().reset_index()
    piv = agg.pivot(index='geo', columns='siec', values='value').fillna(0)
    piv = piv.drop(index=['EU27_2020','EA21'], errors='ignore')
    piv = piv[piv['O4000'] > 0].sort_values('O4000', ascending=True)
    piv['other'] = (piv['O4000'] - piv['O4100_TOT'] - piv['O4600']).clip(lower=0)
    
    labels = {'TR':'Türkiye','SK':'Slovakia','HU':'Hungary','NL':'Netherlands','GE':'Georgia',
              'CZ':'Czechia','HR':'Croatia','PL':'Poland','FR':'France','FI':'Finland',
              'DE':'Germany','LT':'Lithuania','LV':'Latvia','MD':'Moldova','MK':'North Macedonia'}
    names=[labels.get(g,g) for g in piv.index]
    fig,ax=plt.subplots(figsize=(10,7))
    y=np.arange(len(piv))
    ax.barh(y,piv['O4100_TOT'],color='#1f4e79',label='Crude oil')
    ax.barh(y,piv['O4600'],left=piv['O4100_TOT'],color='#e07b39',label='Refined oil products')
    ax.barh(y,piv['other'],left=piv['O4100_TOT']+piv['O4600'],color='#7f7f7f',label='Other oil (NGL, feedstocks, etc.)')
    ax.set_yticks(y); ax.set_yticklabels(names)
    ax.set_xlabel('Thousand tonnes (2025)')
    ax.set_title('Russian oil exports to European countries, 2025 (by destination, thousand tonnes)')
    ax.legend(loc='lower right')
    for i,t in enumerate(piv['O4000']): ax.text(t+250,i,f'{t:,.0f}',va='center',fontsize=9)
    ax.set_xlim(0,piv['O4000'].max()*1.13)
    plt.tight_layout(); plt.savefig('russian_oil_2025.svg')
    print('saved'); print(piv[['O4100_TOT','O4600','other','O4000']].round(1).sort_values('O4000',ascending=False).to_string())
    
  3. Dataset: nrg_ti_oilm

    Dataset filters for nrg_ti_oilm

    FilterValue(s)
    partnerRU
    siecO4000, O4100_TOT, O4600
    unitTHS_T
    sinceTimePeriod2025-01
    untilTimePeriod2025-12

    Program output

    siec  Total oil & petroleum products  Crude oil  Refined oil products
    geo                                                                  
    TR                           32051.8    15229.3               16776.7
    SK                            4923.2     4922.9                   0.3
    HU                            3762.0     3762.0                   0.0
    NL                            1715.5        0.0                   0.0
    GE                            1071.8      225.3                 846.6
    CZ                             527.0      527.0                   0.0
    HR                             423.4        0.0                   0.0
    PL                             294.7        0.0                 294.7
    FR                              29.0        0.0                   0.0
    FI                              15.0        0.0                  15.0
    DE                               7.9        7.9                   0.0
    LT                               6.7        0.0                   6.7
    LV                               2.7        0.0                   2.7
    MD                               0.4        0.0                   0.4
    MK                               0.1        0.0                   0.1
    BE                               0.0        0.0                   0.0
    AT                               0.0        0.0                   0.0
    AL                               0.0        0.0                   0.0
    ES                               0.0        0.0                   0.0
    IT                               0.0        0.0                   0.0
    IE                               0.0        0.0                   0.0
    CY                               0.0        0.0                   0.0
    BG                               0.0        0.0                   0.0
    DK                               0.0        0.0                   0.0
    EE                               0.0        0.0                   0.0
    EL                               0.0        0.0                   0.0
    ME                               0.0        0.0                   0.0
    NO                               0.0        0.0                   0.0
    MT                               0.0        0.0                   0.0
    LU                               0.0        0.0                   0.0
    PT                               0.0        0.0                   0.0
    RS                               0.0        0.0                   0.0
    RO                               0.0        0.0                   0.0
    SI                               0.0        0.0                   0.0
    SE                               0.0        0.0                   0.0
    
    EU27 total reported (aggregate row):
    siec       Total oil & petroleum products  Crude oil  Refined oil products
    geo                                                                       
    EU27_2020                         11707.2     9219.8                 319.5
    EA21                               7123.4     4930.8                  24.7
    
    Sum across listed European countries:
    siec
    Total oil & petroleum products    44831.3
    Crude oil                         24674.4
    Refined oil products              17943.2
    dtype: float64
    

    Code

    
    import pandas as pd, numpy as np
    df = pd.read_csv(DATASET_FILE, dtype=str)
    df['value'] = pd.to_numeric(df['value'], errors='coerce')
    df = df.dropna(subset=['value'])
    
    agg = df.groupby(['geo','siec'])['value'].sum().reset_index()
    piv = agg.pivot(index='geo', columns='siec', values='value').fillna(0)
    piv = piv.rename(columns={'O4000':'Total oil & petroleum products',
                              'O4100_TOT':'Crude oil',
                              'O4600':'Refined oil products'})
    # exclude aggregates
    aggs = ['EU27_2020','EA21']
    countries = piv.drop(index=[a for a in aggs if a in piv.index], errors='ignore')
    countries = countries.sort_values('Total oil & petroleum products', ascending=False)
    pd.set_option('display.width', 200)
    print(countries.round(1).to_string())
    print()
    print('EU27 total reported (aggregate row):')
    print(piv.loc[[a for a in aggs if a in piv.index]].round(1).to_string())
    print()
    print('Sum across listed European countries:')
    print(countries.sum().round(1))