100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Python

Resampling and Rolling Windows

Master resample() for changing time-series frequency and rolling()/expanding() for moving-window calculations like moving averages.

Time Series & VisualizationAdvanced11 min readJul 8, 2026
Analogies

Resampling and Rolling Windows

Two of the most important time-series operations in pandas are resampling and rolling windows, and while they can look superficially similar, they solve different problems. Resampling, via df.resample(rule), changes the frequency of a time series — for example converting daily data into monthly totals ('downsampling') or expanding monthly data into daily data via interpolation ('upsampling'). Rolling windows, via df.rolling(window), keep the original frequency intact but compute a statistic over a sliding window of recent observations, such as a 7-day moving average, smoothing out short-term noise while preserving the overall time resolution.

🏏

Cricket analogy: Resampling is like converting ball-by-ball commentary into an over-by-over summary of runs scored, changing the granularity, while a rolling window is like tracking a batter's average over their last 10 innings, keeping the per-match frequency but smoothing form.

resample() for Frequency Conversion

resample() behaves much like groupby but groups by fixed time intervals (governed by a frequency string like 'D', 'W', 'M', 'Q', 'Y') rather than by column values; each resulting bucket must then be aggregated with a function like .sum(), .mean(), or .ohlc() (open-high-low-close, common in finance). Downsampling from daily to monthly with df.resample('M').sum() reduces row count, while upsampling from monthly to daily with df.resample('D').ffill() (or .interpolate()) increases row count, requiring an explicit strategy to fill the newly created gaps since there's no real data at that finer resolution.

🏏

Cricket analogy: resample('M').sum() groups daily run totals into monthly buckets much like grouping a season's matches by month rather than by team, and resample('D').ffill() upsampling from monthly averages to daily figures requires explicitly carrying forward the last known figure since there's no real ball-by-ball data at that resolution.

python
import pandas as pd

idx = pd.date_range('2026-01-01', periods=14, freq='D')
daily = pd.Series([10, 12, 9, 15, 20, 18, 22, 19, 25, 30, 28, 26, 33, 31], index=idx)

# downsample: daily -> weekly totals (week ending on Sunday by default)
weekly_totals = daily.resample('W').sum()
print(weekly_totals)

# rolling window: 3-day moving average, same length/frequency as original
rolling_avg = daily.rolling(window=3).mean()
print(rolling_avg.head(5))
# 2026-01-01     NaN   (fewer than 3 obs so far)
# 2026-01-02     NaN
# 2026-01-03   10.33
# 2026-01-04   12.00
# 2026-01-05   14.67

# expanding window: cumulative average from the start up to each point
cumulative_avg = daily.expanding().mean()
print(cumulative_avg.tail(3))

rolling() and expanding() for Moving Statistics

df.rolling(window=N) creates windows of N consecutive observations and, by default, produces NaN for the first N-1 rows because a full window isn't yet available (this can be adjusted with min_periods to require fewer observations before computing). Common aggregations applied to a rolling object include .mean() for a moving average, .std() for rolling volatility, and .sum() for a moving total. expanding() is a related but distinct concept: instead of a fixed-size sliding window, it uses an ever-growing window from the start of the series to the current point, useful for cumulative statistics like a running average or running maximum (.expanding().max()).

🏏

Cricket analogy: df.rolling(window=10).mean() on a batter's scores produces NaN for the first 9 innings until a full 10-match window exists, and expanding().max() instead tracks the highest score achieved across the entire career so far, growing with every new innings played.

Choosing Between resample and rolling

A helpful rule of thumb: use resample() when you want to change how often you observe the data (e.g. report monthly instead of daily), and use rolling() when you want to smooth or summarize the data at its existing frequency (e.g. a 30-day moving average of daily stock prices, still reported daily). The two are frequently combined, e.g. first resampling irregular tick data into regular 1-minute bars, then applying a rolling average to smooth those bars.

🏏

Cricket analogy: Use resample() to turn ball-by-ball data into over summaries for a scorecard, and use rolling() to compute a batter's 10-innings moving average at match frequency; combining them, tick-level data first resamples into per-over totals, then a rolling average smooths the trend.

resample() accepts an anchored frequency offset, like 'W-MON' (weeks ending on Monday) or 'MS' (month start rather than month end), giving fine control over exactly where bucket boundaries fall — critical for aligning reports to a business's actual fiscal or reporting calendar.

A rolling window with the default min_periods equal to the window size will produce NaN for the first (window-1) rows. Forgetting this can silently drop early data points from downstream calculations like correlation or plotting without an obvious error.

  • resample() changes a time series' frequency (downsampling reduces rows, upsampling increases them) and requires an aggregation or fill method.
  • rolling(window=N) computes a statistic over the last N observations, producing NaN until a full window is available.
  • expanding() computes a statistic over an ever-growing window from the start of the series, useful for cumulative/running metrics.
  • min_periods on rolling() controls how many observations are required before a value is computed, reducing leading NaNs.
  • Use resample() to change observation frequency; use rolling() to smooth data while keeping its original frequency.
  • Frequency strings like 'D', 'W', 'M', 'Q', 'Y' (and anchored variants like 'W-MON') control both resample buckets and date_range spacing.

Practice what you learned

Was this page helpful?

Topics covered

#Python#PandasNumPyStudyNotes#DataScience#ResamplingAndRollingWindows#Resampling#Rolling#Windows#Resample#StudyNotes#SkillVeris