Skip to main content
Pandas & NumPy
CHAPTER 18 Beginner

Working with Dates and Time Series

Updated: May 18, 2026
5 min read

# CHAPTER 18

Working with Dates and Time Series

1. Chapter Introduction

Time series data — stock prices, sales trends, sensor readings — is among the most valuable data in business. Pandas has world-class datetime support: parsing, filtering, resampling, rolling windows, and time zone handling.

2. Parsing Dates

python
1234567891011121314151617181920
import pandas as pd
import numpy as np

# to_datetime — parse from string
dates = pd.to_datetime(['2024-01-15', '2024-02-20', '2024-03-10'])
print(dates)         # DatetimeIndex
print(dates.dtype)   # datetime64[ns]

# Various formats
pd.to_datetime('15-01-2024', format='%d-%m-%Y')
pd.to_datetime('January 15, 2024', format='%B %d, %Y')
pd.to_datetime('2024/01/15 14:30:00')

# In read_csv
df = pd.read_csv('sales.csv', parse_dates=['Date'])

# Create date range
date_range = pd.date_range(start='2024-01-01', end='2024-12-31', freq='D')  # Daily
months = pd.date_range('2024-01', periods=12, freq='MS')  # Month starts
business = pd.date_range('2024-01-01', periods=10, freq='B')  # Business days

3. DateTime Accessor — dt

python
12345678910111213141516171819
df = pd.DataFrame({
    'Date': pd.date_range('2024-01-01', periods=365, freq='D'),
    'Revenue': np.random.randint(1000, 10000, 365)
})

# Extract date components
df['Year']    = df['Date'].dt.year
df['Month']   = df['Date'].dt.month
df['Day']     = df['Date'].dt.day
df['DayName'] = df['Date'].dt.day_name()
df['Quarter'] = df['Date'].dt.quarter
df['Week']    = df['Date'].dt.isocalendar().week
df['DayOfWeek'] = df['Date'].dt.dayofweek  # 0=Monday, 6=Sunday
df['IsWeekend'] = df['DayOfWeek'].isin([5, 6])

# Month name
df['MonthName'] = df['Date'].dt.month_name()

print(df[['Date', 'Year', 'Month', 'DayName', 'Quarter', 'IsWeekend']].head(10))

4. Date Filtering

python
1234567891011121314
df = df.set_index('Date')  # Set datetime as index for easy filtering

# Filter by date range
jan_data = df['2024-01']                      # All of January
q1_data  = df['2024-01':'2024-03']            # Q1
week_data = df['2024-01-08':'2024-01-14']     # Specific week

# Filter using boolean
weekdays = df[~df['IsWeekend']]
high_revenue = df[df['Revenue'] > 8000]

# Filter by month/year
feb_data = df[df.index.month == 2]
recent = df[df.index >= '2024-06-01']

5. Resampling

python
123456789101112131415161718192021
# resample — group time series by time frequency
df_reset = df.reset_index()

# Weekly summary
weekly = df['Revenue'].resample('W').agg(['sum', 'mean', 'max'])
print("Weekly Summary:\n", weekly.head())

# Monthly summary
monthly = df['Revenue'].resample('ME').agg(
    Total=('Revenue', 'sum'),      # ME = Month End
    Average=('Revenue', 'mean'),
    Peak=('Revenue', 'max')
) if False else df['Revenue'].resample('M').agg({'sum', 'mean', 'max'})

# Common resample frequencies:
# 'D'=Day, 'W'=Week, 'ME'=MonthEnd, 'QE'=QuarterEnd, 'YE'=YearEnd
# 'H'=Hour, 'T'=Minute, 'S'=Second

# Quarterly totals
quarterly = df['Revenue'].resample('Q').sum()
print("Quarterly Revenue:\n", quarterly)

6. Rolling Windows

python
12345678910111213141516
# rolling() — moving window calculations
df['Revenue_7D_MA'] = df['Revenue'].rolling(window=7).mean()   # 7-day moving avg
df['Revenue_30D_MA'] = df['Revenue'].rolling(window=30).mean() # 30-day moving avg
df['Revenue_7D_Std'] = df['Revenue'].rolling(window=7).std()   # 7-day volatility

# Expanding window (cumulative from start)
df['Revenue_Cumsum'] = df['Revenue'].expanding().sum()
df['Revenue_CumMax'] = df['Revenue'].expanding().max()

print(df[['Revenue', 'Revenue_7D_MA', 'Revenue_30D_MA']].head(10))

# Time-based shifting
df['Revenue_Yesterday'] = df['Revenue'].shift(1)   # Previous day
df['Revenue_NextWeek']  = df['Revenue'].shift(-7)  # 7 days ahead
df['Revenue_Change']    = df['Revenue'].diff()     # Day-over-day change
df['Revenue_PctChange'] = df['Revenue'].pct_change() * 100  # % change

7. Common Mistakes

  • Strings not parsed as dates: After readcsv, date columns are strings by default. Always use parsedates=['col'] or pd.todatetime(df['col']).
  • resample requires DatetimeIndex: Set the date column as index with df.setindex('Date') before resampling.

8. MCQs

Question 1

pd.todatetime() converts?

Question 2

df['Date'].dt.month extracts?

Question 3

df['2024-01'] with DatetimeIndex?

Question 4

resample('W').sum() aggregates?

Question 5

rolling(7).mean() computes?

Question 6

pctchange() returns?

Question 7

shift(1) does?

Question 8

expanding().sum() computes?

Question 9

dt.dayofweek == 5 means?

Question 10

diff() on time series computes?

9. Interview Questions

  • Q: How do you resample daily data to monthly totals in Pandas?
  • Q: What is the difference between rolling() and expanding()?

10. Summary

Pandas datetime support: to_datetime() for parsing, .dt accessor for component extraction, date-based filtering with DatetimeIndex, resample() for frequency conversion, and rolling()/expanding() for moving window analytics. Time series analysis is Pandas' strongest domain.

11. Next Chapter Recommendation

In Chapter 19: Data Visualization with Pandas, we create line charts, bar charts, histograms, and scatter plots directly from DataFrames.

Finish this Chapter

Save your progress on your learning path and prepare for coding interview challenges.

Discussion

Join the discussion

Log in or create a free account to participate.

Sort: ·