Current FedEx Fuel Surcharges

This will fetch and clean the current fuel surcharge table.

library(tidyverse)
library(lubridate)
library(rvest)

fedex_html <-
        read_html('https://www.fedex.com/en-us/shipping/fuel-surcharge.html')

fedex_current_tables <- fedex_html %>%
        html_elements("table") %>%
        html_table()

fedex_current_cleaned <- fedex_current_tables[[1]][c(-1,-2), ] %>%
        mutate(X1 = str_replace_all(X1, 'Sept', 'Sep')) %>%
        select(-X6, -X8) %>%
        rename(
                date_range = X1,
                `fedex_express_fuel_surcharge_rate` = X2,
                `fedex_freight_fuel_surcharge_rate` = X3,
                `fedex_export_fuel_surcharge_rate` = X4,
                `fedex_import_fuel_surcharge_rate` = X5,
                `fedex_ground_fuel_surcharge_rate` = X7
        ) %>%
        mutate(start_date = mdy(str_split(date_range, '–', 2, simplify = T)[, 1]),
               end_date = mdy(str_split(date_range, '–', 2, simplify = T)[, 2])) %>%
        mutate(
                fedex_ground_fuel_surcharge_rate = as.numeric(str_remove(fedex_ground_fuel_surcharge_rate, '%')) /
                        100,
                fedex_express_fuel_surcharge_rate = as.numeric(str_remove(fedex_express_fuel_surcharge_rate, '%')) /
                        100,
                fedex_import_fuel_surcharge_rate = as.numeric(str_remove(fedex_import_fuel_surcharge_rate, '%')) /
                        100,
                fedex_export_fuel_surcharge_rate = as.numeric(str_remove(fedex_export_fuel_surcharge_rate, '%')) /
                        100,
                fedex_freight_fuel_surcharge_per_lbs = as.numeric(str_remove(
                        str_remove(fedex_freight_fuel_surcharge_rate, '\\$'),
                        ' per lb.'
                ))
        )

fedex_current_cleaned
## # A tibble: 2 x 9
##   date_range fedex_express_f~ fedex_freight_f~ fedex_export_fu~ fedex_import_fu~
##   <chr>                 <dbl> <chr>                       <dbl>            <dbl>
## 1 Sep. 12, ~             0.2  $0.516 per lb.              0.222            0.26 
## 2 Sep. 5, 2~             0.21 $0.532 per lb.              0.235            0.272
## # ... with 4 more variables: fedex_ground_fuel_surcharge_rate <dbl>,
## #   start_date <date>, end_date <date>,
## #   fedex_freight_fuel_surcharge_per_lbs <dbl>

Previous FedEx Fuel Surcharges

This will fetch and clean the previous fuel surcharge table.

fedex_history_html <-
        read_html("https://www.fedex.com/en-us/shipping/historical-fuel-surcharge.html")

fedex_history_tables <- fedex_history_html %>%
        html_elements("table") %>%
        html_table()

fedex_history_cleaned <-
        fedex_history_tables[[1]][c(-1, -2),] %>%
        mutate(X1 = str_replace_all(X1, 'Sept', 'Sep')) %>%
        rename(
                date_range = X1,
                `fedex_express_fuel_surcharge_rate` = X2,
                `fedex_freight_fuel_surcharge_rate` = X3,
                `fedex_export_fuel_surcharge_rate` = X4,
                `fedex_import_fuel_surcharge_rate` = X5,
                `fedex_ground_fuel_surcharge_rate` = X6
        ) %>%
        mutate(start_date = mdy(str_split(date_range, '–', 2, simplify = T)[, 1]),
               end_date = mdy(str_split(date_range, '–', 2, simplify = T)[, 2])) %>%
        mutate(
                fedex_ground_fuel_surcharge_rate = as.numeric(str_remove(fedex_ground_fuel_surcharge_rate, '%')) /
                        100,
                fedex_express_fuel_surcharge_rate = as.numeric(str_remove(fedex_express_fuel_surcharge_rate, '%')) /
                        100,
                fedex_import_fuel_surcharge_rate = as.numeric(str_remove(fedex_import_fuel_surcharge_rate, '%')) /
                        100,
                fedex_export_fuel_surcharge_rate = as.numeric(str_remove(fedex_export_fuel_surcharge_rate, '%')) /
                        100,
                fedex_freight_fuel_surcharge_per_lbs = as.numeric(str_remove(
                        str_remove(fedex_freight_fuel_surcharge_rate, '\\$'),
                        ' per lb.'
                ))
        )

fedex_history_cleaned
## # A tibble: 13 x 9
##    date_range                  fedex_express_f~ fedex_freight_f~ fedex_export_fu~
##    <chr>                                  <dbl> <chr>                       <dbl>
##  1 Aug. 29, 2022–Sep. 4, 2022             0.192 $0.504 per lb.              0.212
##  2 Aug. 22, 2022–Aug. 28, 2022            0.185 $0.492 per lb.              0.205
##  3 Aug. 15, 2022–Aug. 21, 2022            0.185 $0.492 per lb.              0.202
##  4 Aug. 8, 2022–Aug. 14, 2022             0.2   $0.516 per lb.              0.222
##  5 Aug. 1, 2022–Aug. 7, 2022              0.198 $0.512 per lb.              0.22 
##  6 July 25, 2022–July 31, 2022            0.205 $0.524 per lb.              0.23 
##  7 July 18, 2022–July 24, 2022            0.2   $0.516 per lb.              0.22 
##  8 July 11, 2022–July 17, 2022            0.225 $0.556 per lb.              0.252
##  9 July 4, 2022–July 10, 2022             0.238 $0.576 per lb.              0.268
## 10 June 27, 2022–July 3, 2022             0.235 $0.572 per lb.              0.265
## 11 June 20, 2022–June 26, 2022            0.235 $0.572 per lb.              0.265
## 12 June 13, 2022–June 19, 2022            0.228 $0.560 per lb.              0.255
## 13 June 6, 2022–June 12, 2022             0.215 $0.540 per lb.              0.24 
## # ... with 5 more variables: fedex_import_fuel_surcharge_rate <dbl>,
## #   fedex_ground_fuel_surcharge_rate <dbl>, start_date <date>, end_date <date>,
## #   fedex_freight_fuel_surcharge_per_lbs <dbl>

Combined Together and Blown Out to Day

fedex_rates <-
        bind_rows(fedex_current_cleaned, fedex_history_cleaned)

fedex_full_table <-
        tibble(
                date = date(),
                fedex_ground_fuel_surcharge_rate = numeric(),
                fedex_express_fuel_surcharge_rate = numeric(),
                fedex_import_fuel_surcharge_rate = numeric(),
                fedex_export_fuel_surcharge_rate = numeric(),
                fedex_freight_fuel_surcharge_rate = numeric()
                ,
        )

for (i in 1:dim(fedex_rates)[1]) {
        fedex2 <-
                tibble(
                        date = seq(fedex_rates$start_date[i], fedex_rates$end_date[i], by = 'days'),
                        fedex_ground_fuel_surcharge_rate = fedex_rates$fedex_ground_fuel_surcharge_rate[i],
                        fedex_express_fuel_surcharge_rate = fedex_rates$fedex_express_fuel_surcharge_rate[i],
                        fedex_import_fuel_surcharge_rate = fedex_rates$fedex_import_fuel_surcharge_rate[i],
                        fedex_export_fuel_surcharge_rate = fedex_rates$fedex_export_fuel_surcharge_rate[i],
                        fedex_freight_fuel_surcharge_rate = fedex_rates$fedex_freight_fuel_surcharge_rate[i]
                )
        fedex_full_table <- rbind(fedex_full_table, fedex2)
}

fedex_full_table %>% arrange(desc(date))
## # A tibble: 105 x 6
##    date       fedex_ground_fuel_surcharge_rate fedex_express_f~ fedex_import_fu~
##    <date>                                <dbl>            <dbl>            <dbl>
##  1 2022-09-18                            0.178             0.2             0.26 
##  2 2022-09-17                            0.178             0.2             0.26 
##  3 2022-09-16                            0.178             0.2             0.26 
##  4 2022-09-15                            0.178             0.2             0.26 
##  5 2022-09-14                            0.178             0.2             0.26 
##  6 2022-09-13                            0.178             0.2             0.26 
##  7 2022-09-12                            0.178             0.2             0.26 
##  8 2022-09-11                            0.178             0.21            0.272
##  9 2022-09-10                            0.178             0.21            0.272
## 10 2022-09-09                            0.178             0.21            0.272
## # ... with 95 more rows, and 2 more variables:
## #   fedex_export_fuel_surcharge_rate <dbl>,
## #   fedex_freight_fuel_surcharge_rate <chr>

Write it Somewhere

write_csv(fedex_full_table, "FedEx Fuel Surcharges.csv")