Monthly minimum wages - bi-annual data

Data - Eurostat

Info

Last observation: Semi-annual: 2026S1 (N = 111)

First observation: Semi-annual: 1999S1 (N = 105)

Last data update: 23 jul 2026, 23:19. Last compile: 24 jul 2026, 01:12

Structure

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) %>%
  
  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) %>%
  
  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") %>%
  
  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") %>%
  
  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") %>%
  
  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") %>%
  
  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") %>%
  
  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 .}