How to Group Data by Hour in R

Spread the love

When working with temporal data in R, you may frequently encounter the need to group records by different time frames, like years, months, days, or even hours. Grouping data by hour can be especially useful in analyses that involve understanding daily trends, user activity, or performance metrics that are likely to change throughout the day. This article will guide you through various techniques for grouping data by hour in R, taking you from the basics to more advanced methods.

Data Preparation

Let’s create a sample dataset containing a timestamp and sales for that particular hour.

# Load required packages

# Generate example data
data <- data.frame(
  DateTime = seq.POSIXt(from = as.POSIXct("2021-01-01 00:00:00"),
                         to = as.POSIXct("2021-01-07 23:00:00"),
                         by = "hour"),
  Sales = sample(100:200, size = 7 * 24, replace = TRUE)

Grouping Data by Hour Using Base R

Extracting Hour Information

The first step in grouping your data by hour is to extract the hour information from your datetime column.

data$Hour <- as.integer(format(data$DateTime, "%H"))

Grouping and Summing Sales by Hour

After extracting the hour information, you can use R’s base function aggregate to sum up sales by hour.

result_baseR <- aggregate(Sales ~ Hour, data = data, FUN = sum)

Using dplyr for Grouping by Hour

Simple Aggregation with dplyr

dplyr makes it incredibly straightforward to group data. We can use group_by along with summarise.

data %>% 
  mutate(Hour = hour(DateTime)) %>%
  group_by(Hour) %>%
  summarise(SumSales = sum(Sales))

Multiple Aggregations

dplyr also makes it easy to perform multiple aggregations.

data %>% 
  mutate(Hour = hour(DateTime)) %>%
  group_by(Hour) %>%
    SumSales = sum(Sales),
    AvgSales = mean(Sales),
    MinSales = min(Sales),
    MaxSales = max(Sales)

Using lubridate for Easy Datetime Manipulations

lubridate is a package specifically designed for datetime manipulations. The hour() function makes it easy to extract the hour from a datetime column.

data$Hour <- hour(data$DateTime)

You can use this extracted column along with dplyr to group your data.

Grouping by Multiple Columns

Sometimes, you may want to group by both the hour and another column, say the day of the week.

data %>% 
  mutate(Hour = hour(DateTime),
         DayOfWeek = weekdays(DateTime)) %>%
  group_by(DayOfWeek, Hour) %>%
  summarise(SumSales = sum(Sales))

Advanced Techniques

Using data.table for Large Datasets

For large datasets, data.table can be much faster than dplyr.

# Load data.table

# Convert data frame to data.table
data_DT <-

# Group by Hour
result_DT <- data_DT[, .(SumSales = sum(Sales)), by = hour(DateTime)]

Using Rolling Time Windows

For more advanced analyses, you might want to group by rolling time windows. The slider package can help with that.

# Load slider

# Compute rolling hourly sum
data %>%
  arrange(DateTime) %>%
  mutate(RollingSum = slide_dbl(.x = Sales,
                                 .f = ~sum(.x),
                                 .width = hours(3)))

Time Series Packages in R

Using xts Package

xts is another useful package for handling time series data.

# Load xts

# Create xts object
data_xts <- xts(x = data$Sales, = data$DateTime)

# Group by hour
result_xts <- apply.daily(data_xts, FUN = sum)


Whether you’re new to R or a seasoned user, the ability to group data by hour can be a significant asset. As demonstrated, there are many ways to accomplish this task. You can use Base R, take advantage of the dplyr and lubridate packages for a more straightforward and readable code, or use data.table and xts for more advanced and efficient operations. The choice will often depend on your specific needs, the size of your dataset, and your personal preference for code readability and performance. Regardless of the method you choose, understanding how to properly aggregate and analyze your data over specific time frames is a crucial skill for anyone in the field of data science.

Posted in RTagged

Leave a Reply