Mastering Time Manipulation in R: Subtracting Hours with Ease


Steven P. Sanderson II, MPH


January 30, 2024


Ever wished you could rewind time in R, not just for debugging, but for actual data analysis? Well, you don’t need plutonium and flux capacitors! Let’s dive into the fascinating world of time manipulation in R, specifically subtracting hours from timestamps. We’ll explore two approaches: one using base R’s time-bending tricks, and another powered by the lubridate package, our time-traveling companion.


Base R: Back to the Basics

Imagine a timestamp like a ticking clock. Each second is another notch on the gears, and we want to turn those gears backward a few hours. Base R lets us do this by treating time as numbers. Remember, there are 3600 seconds in an hour, so to subtract 2 hours, we simply:

my_time <- as.POSIXct("2024-01-30 10:00:00") # Create a time object
new_time <- my_time - (2 * 3600) # Subtract 2 hours (2 * 3600 seconds)
print(my_time) # See the original time
[1] "2024-01-30 10:00:00 EST"
print(new_time) # Voila! 2 hours back!
[1] "2024-01-30 08:00:00 EST"

This code tells R to:

  1. Create a time object my_time representing “January 30, 2024, 10:00 AM”.
  2. Define new_time by subtracting 2 hours from my_time. We multiply 2 by 3600 because, well, you get the point.
  3. Print both times to see the magic unfold.

Lubridate: Time Travel Made Easy

But what if you want a fancier ride? This is where lubridate comes in! This package adds superpowers to our time-traveling toolkit. Let’s rewrite the above using its hours() function:

library(lubridate) # Load the lubridate package

my_time <- as.POSIXct("2024-01-30 10:00:00")
new_time <- my_time - hours(2) # Subtract 2 hours with the `hours()` function
[1] "2024-01-30 10:00:00 EST"
[1] "2024-01-30 08:00:00 EST"

This code does the same thing, but with less math and more clarity. We simply tell R to subtract 2 hours using the hours(2) function, making the code cleaner and more readable.

Bonus Round: Negative Time Zones? No Problem!

Let’s say you’re working with data from different time zones. Fear not! Both base R and lubridate can handle these complexities. Simply specify the time zone when creating your time object, and the calculations will adjust accordingly.

Time to Experiment!

Now that you have the tools, try these challenges:

  1. Write a function to subtract any number of hours from a given time.
  2. Calculate the time difference between two events in different time zones.
  3. Explore other lubridate functions for manipulating dates and times.

Remember, practice makes perfect (and less buggy code!). So, fire up R, grab your data, and let’s start time-traveling!

Bonus Tip: For extra nerdy fun, try plotting your time-shifted data to visualize the journey through time.

Happy R-ing and happy time-traveling!