Source code for portfolio_toolkit.utils.period.get_last_quarters

from datetime import date
from typing import List

from .period import Period


[docs] def get_last_quarters(n=4) -> List[Period]: """ Returns the last n completed quarters as Period objects (excluding current quarter). Financial quarters: Q1 (Jan-Mar), Q2 (Apr-Jun), Q3 (Jul-Sep), Q4 (Oct-Dec) For n=4 in Q3 2025, returns: [Period("Q3 2024", date(2024, 7, 1), date(2024, 9, 30)), Period("Q4 2024", date(2024, 10, 1), date(2024, 12, 31)), Period("Q1 2025", date(2025, 1, 1), date(2025, 3, 31)), Period("Q2 2025", date(2025, 4, 1), date(2025, 6, 30))] Args: n (int): Number of completed quarters to return Returns: List[Period]: List of Period objects representing each completed quarter """ today = date.today() results = [] # Determine current quarter and year current_quarter = (today.month - 1) // 3 + 1 current_year = today.year for i in range(1, n + 1): # Start from 1 to exclude current quarter # Calculate target quarter and year (go back i quarters) target_quarter = current_quarter - i target_year = current_year # Adjust year if quarter goes negative while target_quarter <= 0: target_quarter += 4 target_year -= 1 # Map quarter to start and end dates quarter_dates = { 1: ((1, 1), (3, 31)), # Q1: Jan 1 - Mar 31 2: ((4, 1), (6, 30)), # Q2: Apr 1 - Jun 30 3: ((7, 1), (9, 30)), # Q3: Jul 1 - Sep 30 4: ((10, 1), (12, 31)), # Q4: Oct 1 - Dec 31 } # Get start and end dates start_month, start_day = quarter_dates[target_quarter][0] end_month, end_day = quarter_dates[target_quarter][1] start_date = date(target_year, start_month, start_day) end_date = date(target_year, end_month, end_day) # Create quarter label quarter_label = f"Q{target_quarter} {target_year}" # Create Period object quarter_period = Period(quarter_label, start_date, end_date) results.append(quarter_period) results.reverse() # Sort chronologically from oldest to newest return results