Mastering Date Calculations in R: A Guide to Calculating Months with Base R and lubridate


Steven P. Sanderson II, MPH


January 24, 2024


Greetings fellow R enthusiasts! Today, let’s dive into the fascinating world of date calculations. Whether you’re a data scientist, analyst, or just someone who loves coding in R, understanding how to calculate the number of months between dates is a valuable skill. In this blog post, we’ll explore two approaches using both base R and the lubridate package, ensuring you have the tools to tackle any date-related challenge that comes your way.


Base R Method

Let’s start with the basics – base R. The difftime function will be our trusty companion in this method. The idea is to find the time difference between two dates and then convert it into months.

# Sample dates
start_date <- as.Date("2022-01-15")
end_date <- as.Date("2023-07-20")

# Calculate time difference in days
time_diff_days <- end_date - start_date

# Convert days to months
months_diff_base <- as.numeric(time_diff_days) / 30.44  # average days in a month

cat("Number of months using base R:", round(months_diff_base, 2), "\n")
Number of months using base R: 18.1 


  • We define our start and end dates using the as.Date function.
  • Calculate the time difference in days using the subtraction operator.
  • Convert the time difference to months by dividing by the average days in a month (30.44).

Lubridate Package Method

Now, let’s add a touch of elegance to our date calculations with the lubridate package. This package simplifies working with dates and times in R, making our code more readable and intuitive.

# Load the lubridate package

# Sample dates
start_date <- ymd("2022-01-15")
end_date <- ymd("2023-07-20")

# Calculate months difference using lubridate
months_diff_lubridate <- interval(start_date, end_date) %/% months(1)

cat("Number of months using lubridate:", months_diff_lubridate, "\n")
Number of months using lubridate: 18 


  • We load the lubridate package to leverage its convenient date functions.
  • Use the ymd function to convert our dates into lubridate date objects.
  • Create an interval between the start and end dates and use %/% to get the floor division by months.

Handling Partial Months

Life isn’t always about whole months, and our date calculations should reflect that reality. Let’s modify our examples to include partial months.

# Sample dates with partial months
start_date_partial <- as.Date("2022-01-15")
end_date_partial <- as.Date("2023-07-20") - 15  # subtract 15 days for a partial month

# Base R with partial months
time_diff_days_partial <- end_date_partial - start_date_partial
months_diff_base_partial <- as.numeric(time_diff_days_partial) / 30.44

cat("Number of months (with partial) using base R:", round(months_diff_base_partial, 2), "\n")
Number of months (with partial) using base R: 17.61 
# Lubridate with partial months
months_diff_lubridate_partial <- interval(start_date_partial, end_date_partial) / months(1)

cat("Number of months (with partial) using lubridate:", months_diff_lubridate_partial, "\n")
Number of months (with partial) using lubridate: 17.66667 

More lubridate with interval()

The lubridate package makes working with dates in R much easier. It provides the interval function to calculate the time difference between two dates:

date1 <- ymd("2023-01-15")
date2 <- ymd("2024-04-30")

interval(date1, date2) / months(1) 
[1] 15.5

This returns the number of months including the partial:

[1] 15.870968

To get just the full months:

interval(date1, date2) %/% months(1)
[1] 15

Which gives:

[1] 15

The interval function combined with lubridate’s months makes this a very clean way to calculate both full and partial months between dates.


Congratulations! You’ve now mastered the art of calculating months between dates in R using both base R and the lubridate package. I encourage you to try different date ranges, experiment with partial months, and explore other date-related functions in R. The more you practice, the more confident you’ll become in handling time-related data in your projects. Happy coding!