Monthly minimum wages - bi-annual data

Data - Eurostat

Info

source dataset Title .html .rData
eurostat earn_mw_cur Monthly minimum wages - bi-annual data 2025-10-10 2025-10-10

Data on wages

source dataset Title .html .rData
eurostat earn_mw_cur Monthly minimum wages - bi-annual data 2025-10-10 2025-10-10
eurostat ei_lmlc_q Labour cost index, nominal value - quarterly data 2025-10-10 2025-10-10
eurostat lc_lci_lev Labour cost levels by NACE Rev. 2 activity 2025-10-10 2025-10-10
eurostat lc_lci_r2_q Labour cost index by NACE Rev. 2 activity - nominal value, quarterly data 2025-10-10 2025-09-26
eurostat nama_10_lp_ulc Labour productivity and unit labour costs 2025-10-10 2025-10-10
eurostat namq_10_lp_ulc Labour productivity and unit labour costs 2025-10-10 2025-09-26
eurostat tps00155 Minimum wages 2025-10-10 2025-10-10
fred wage Wage 2025-10-09 2025-10-09
ilo EAR_4MTH_SEX_ECO_CUR_NB_A Mean nominal monthly earnings of employees by sex and economic activity -- Harmonized series 2024-06-20 2023-06-01
ilo EAR_XEES_SEX_ECO_NB_Q Mean nominal monthly earnings of employees by sex and economic activity -- Harmonized series 2024-06-20 2023-06-01
oecd AV_AN_WAGE Average annual wages 2025-09-29 2025-09-28
oecd AWCOMP Taxing Wages - Comparative tables 2025-09-29 2023-09-09
oecd EAR_MEI Hourly Earnings (MEI) 2024-04-16 2024-04-16
oecd HH_DASH Household Dashboard 2025-09-29 2023-09-09
oecd MIN2AVE Minimum relative to average wages of full-time workers - MIN2AVE 2025-09-29 2023-09-09
oecd RMW Real Minimum Wages - RMW 2025-09-29 2024-03-12
oecd ULC_EEQ Unit labour costs and labour productivity (employment based), Total economy 2025-09-29 2024-04-15

LAST_COMPILE

LAST_COMPILE
2025-10-11

Last

Code
earn_mw_cur %>%
  group_by(time) %>%
  summarise(Nobs = n()) %>%
  arrange(desc(time)) %>%
  head(3) %>%
  print_table_conditional()
time Nobs
2025S2 111
2025S1 111
2024S2 112

currency

Code
earn_mw_cur %>%
  left_join(currency, by = "currency") %>%
  group_by(currency, Currency) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
currency Currency Nobs
NAC National currency 2039
EUR Euro 2036
PPS Purchasing Power Standard 1927

geo

Code
earn_mw_cur %>%
  left_join(geo, by = "geo") %>%
  group_by(geo, Geo) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

time

Code
earn_mw_cur %>%
  group_by(time) %>%
  summarise(Nobs = n()) %>%
  arrange(desc(time)) %>%
  print_table_conditional()

Minimum Wage Increases

png

Code
i_g("bib/eurostat/earn_mw_cur_ex3.png")

2021S2-2023S1

Code
earn_mw_cur %>%
  filter(time %in% c("2023S1", "2022S2", "2022S1", "2021S2"),
         geo %in% c("AT", "BE", "CY", "DE", "EE", "EL", "ES", "FI", "FR", "IE",
                    "IT", "LT", "LU", "LV", "MT", "NL", "PT", "SI", "SK"),
         currency == "EUR") %>%
  filter(!is.na(values)) %>%
  spread(time, values) %>%
  select(-currency) %>%
  left_join(geo, by = "geo") %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, geo, Geo, everything()) %>%
  mutate(growth = round(100*(`2023S1`/`2021S2`-1), 1)) %>%
  arrange(-growth) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

National currency

Code
earn_mw_cur %>%
  filter(time %in% c("2023S1", "2022S2", "2022S1", "2021S2"),
         geo %in% c("AT", "BE", "CY", "DE", "EE", "EL", "ES", "FI", "FR", "IE",
                    "IT", "LT", "LU", "LV", "MT", "NL", "PT", "SI", "SK"),
         currency == "NAC") %>%
  filter(!is.na(values)) %>%
  spread(time, values) %>%
  select(-currency) %>%
  left_join(geo, by = "geo") %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, geo, Geo, everything()) %>%
  mutate(growth = round(100*(`2023S1`/`2021S2`-1), 1)) %>%
  arrange(-growth) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

Minimum Wages in Euros

png

Code
i_g("bib/eurostat/earn_mw_cur_ex1.png")

Javascript

Code
earn_mw_cur %>%
  filter(time %in% c("2000S1", "2005S1", "2010S1", "2015S1", "2020S1"), 
         currency == "EUR") %>%
  left_join(geo, by = "geo") %>%
  select(geo, Geo, time, values) %>%
  na.omit %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo),
         values = round(values)) %>%
  spread(time, values) %>%
  arrange(-`2020S1`) %>%
  mutate_at(vars(-1, -2), funs(ifelse(is.na(.), "", paste0(., " €")))) %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

Map 2010S2

Code
earn_mw_cur %>%
  filter(time == "2010S2", 
         currency == "EUR") %>%
  left_join(geo, by = "geo") %>%
  select(geo, Geo, values) %>%
  right_join(europe_NUTS0, by = "geo") %>%
  filter(long >= -15, lat >= 33) %>%
  ggplot(., aes(x = long, y = lat, group = group, fill = values)) +
  geom_polygon() + coord_map() +
  scale_fill_viridis_c(na.value = "white",
                       labels = scales::dollar_format(accuracy = 1, prefix = "", suffix = "€"),
                       breaks = seq(0, 3000, 200),
                       values = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 1)) +
  theme_void() + theme(legend.position = c(0.25, 0.85)) + 
  labs(fill = "Minimum Wage")

Map 2020S2

Code
earn_mw_cur %>%
  filter(time == "2020S2", 
         currency == "EUR") %>%
  left_join(geo, by = "geo") %>%
  select(geo, Geo, values) %>%
  right_join(europe_NUTS0, by = "geo") %>%
  filter(long >= -15, lat >= 33) %>%
  ggplot(., aes(x = long, y = lat, group = group, fill = values)) +
  geom_polygon() + coord_map() +
  scale_fill_viridis_c(na.value = "white",
                       labels = scales::dollar_format(accuracy = 1, prefix = "", suffix = "€"),
                       breaks = seq(0, 3000, 200),
                       values = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 1)) +
  theme_void() + theme(legend.position = c(0.25, 0.85)) + 
  labs(fill = "Minimum Wage")

Minimum Wages in PPS

png

Code
i_g("bib/eurostat/earn_mw_cur_ex2.png")

Javascript

Code
earn_mw_cur %>%
  filter(time %in% c("2000S1", "2005S1", "2010S1", "2015S1", "2020S1"), 
         currency == "PPS") %>%
  left_join(geo, by = "geo") %>%
  select(geo, Geo, time, values) %>%
  na.omit %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo),
         values = round(values)) %>%
  spread(time, values) %>%
  arrange(-`2020S1`) %>%
  mutate_at(vars(-1, -2), funs(ifelse(is.na(.), "", paste0(., " €")))) %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

Minimum Wages in National Currency

Javascript

Code
earn_mw_cur %>%
  filter(time %in% c("2000S1", "2005S1", "2010S1", "2015S1", "2020S1"), 
         currency == "NAC") %>%
  left_join(geo, by = "geo") %>%
  select(geo, Geo, time, values) %>%
  na.omit %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo),
         values = round(values)) %>%
  spread(time, values) %>%
  arrange(-`2020S1`) %>%
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}