Date formatting with mdates in Matplotlib - Time & Space Complexity
We want to understand how the time to format dates grows when using matplotlib's mdates.
How does the work change as we add more dates to format?
Analyze the time complexity of the following code snippet.
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime
# Create a list of dates
dates = [datetime.date(2024, 1, 1) + datetime.timedelta(days=i) for i in range(100)]
fig, ax = plt.subplots()
ax.plot(dates, range(100))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.show()
This code plots 100 points with dates on the x-axis and formats those dates using mdates.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Formatting each date label on the x-axis.
- How many times: Once for each date tick shown (up to the number of dates).
As the number of dates increases, the number of formatting operations grows roughly the same.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 date formats |
| 100 | About 100 date formats |
| 1000 | About 1000 date formats |
Pattern observation: The work grows linearly as we add more dates to format.
Time Complexity: O(n)
This means the time to format dates grows directly in proportion to the number of dates.
[X] Wrong: "Formatting dates happens instantly no matter how many there are."
[OK] Correct: Each date label needs to be processed, so more dates mean more work and more time.
Understanding how formatting scales helps you write efficient plots and handle large datasets smoothly.
"What if we used fewer date ticks by changing the locator? How would the time complexity change?"
Practice
mdates.DateFormatter in matplotlib?Solution
Step 1: Understand the role of DateFormatter
mdates.DateFormatteris used to format date labels on axes in matplotlib plots.Step 2: Identify what DateFormatter customizes
It changes how dates are shown, for example, showing only month and day or full date and time.Final Answer:
To customize how dates appear on the x-axis of a plot -> Option AQuick Check:
DateFormatter formats dates = A [OK]
- Confusing DateFormatter with plot styling functions
- Thinking it changes plot colors
- Assuming it saves files
mdates.DateFormatter?Solution
Step 1: Recall strftime format codes
Year is '%Y', month is '%m', day is '%d' in strftime formatting.Step 2: Match correct format string
mdates.DateFormatter('%Y-%m-%d') uses '%Y-%m-%d' which correctly formats as Year-Month-Day.Final Answer:
mdates.DateFormatter('%Y-%m-%d') -> Option DQuick Check:
Correct strftime codes = B [OK]
- Omitting % signs in format string
- Using uppercase M for minutes instead of month
- Mixing order of year, month, day
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
dates = pd.date_range('2023-01-01', periods=3)
values = [10, 20, 15]
fig, ax = plt.subplots()
ax.plot(dates, values)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %d'))
plt.show()Solution
Step 1: Understand the format string '%b %d'
'%b' is abbreviated month name (e.g., Jan), '%d' is day with leading zero.Step 2: Apply format to dates
Dates will appear as 'Jan 01', 'Jan 02', 'Jan 03' on x-axis labels.Final Answer:
Labels show dates as 'Jan 01', 'Jan 02', 'Jan 03' -> Option BQuick Check:
Format '%b %d' = 'Jan 01' style [OK]
- Confusing %b with %B (full month name)
- Expecting numeric month instead of abbreviated
- Ignoring leading zeros in day
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
dates = pd.date_range('2023-01-01', periods=3)
values = [5, 10, 15]
fig, ax = plt.subplots()
ax.plot(dates, values)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
ax.xaxis.set_major_locator(mdates.DayLocator())
plt.show()Solution
Step 1: Check imports and usage
All necessary imports are present, including mdates.DayLocator and DateFormatter.Step 2: Verify date formatting and locator
DateFormatter uses valid '%Y-%m-%d' format; DayLocator sets ticks daily. Dates are pandas datetime objects, which matplotlib handles.Final Answer:
No error; code runs and formats dates correctly -> Option AQuick Check:
Correct imports and usage = D [OK]
- Assuming pandas dates need manual conversion
- Using wrong format codes in DateFormatter
- Forgetting to set locator for ticks
mdates functions should you use to achieve this?Solution
Step 1: Choose locator for Mondays only
mdates.WeekdayLocator(byweekday=mdates.MO)selects ticks only on Mondays.Step 2: Format labels as 'Month-Day'
mdates.DateFormatter('%b-%d')formats dates like 'Jan-02'.Final Answer:
Use mdates.WeekdayLocator(byweekday=mdates.MO) and mdates.DateFormatter('%b-%d') -> Option CQuick Check:
Monday ticks + 'Jan-02' format = C [OK]
- Using DayLocator shows all days, not Mondays only
- MonthLocator shows monthly ticks, not weekly
- HourLocator is for time, not dates
Ready to prove it?
Pass the test and this pattern moves unknown
