🛠️ToolsShed

Heart Rate Zone Calculator

Calculate your 5 training heart rate zones based on age and resting heart rate.

Heart Rate Zone Calculator identifies your five training heart rate zones based on your age and optionally your measured resting heart rate. Training in specific heart rate zones allows you to target different physiological adaptations: Zone 1 (recovery) improves base fitness with minimal fatigue, Zone 2 (aerobic base) trains fat burning and endurance, Zone 3 (aerobic threshold) improves cardiovascular efficiency, Zone 4 (lactate threshold) increases speed and sustainable pace, and Zone 5 (VO2 Max) maximizes oxygen uptake and power.

Enter your age and the tool estimates your Maximum Heart Rate (MHR) using the most common formula: 220 minus age. If you know your actual MHR from a fitness test, enter it for more accurate zones. Adding your resting heart rate activates the Karvonen method for a more personalized calculation.

To use heart rate zones effectively, wear a heart rate monitor during workouts and aim to stay within the target zone for the duration of the planned effort. Most recreational athletes benefit from spending the majority of their training time (about 80%) in Zones 1-2 and a smaller portion (20%) in higher intensity zones.

Frequently Asked Questions

Code Implementation

def calculate_hr_zones(age: int, resting_hr: int = 60, method: str = "fox") -> dict:
    """
    Calculate heart rate training zones.
    method: 'fox' (220 - age), 'tanaka' (208 - 0.7 * age), 'karvonen' (uses resting HR)
    """
    if method == "tanaka":
        max_hr = 208 - 0.7 * age
    else:
        max_hr = 220 - age

    if method == "karvonen":
        hrr = max_hr - resting_hr  # Heart Rate Reserve
        zones = {
            "Zone 1 (Recovery)":  (resting_hr + 0.50 * hrr, resting_hr + 0.60 * hrr),
            "Zone 2 (Aerobic)":   (resting_hr + 0.60 * hrr, resting_hr + 0.70 * hrr),
            "Zone 3 (Tempo)":     (resting_hr + 0.70 * hrr, resting_hr + 0.80 * hrr),
            "Zone 4 (Threshold)": (resting_hr + 0.80 * hrr, resting_hr + 0.90 * hrr),
            "Zone 5 (Max)":       (resting_hr + 0.90 * hrr, max_hr),
        }
    else:
        zones = {
            "Zone 1 (Recovery)":  (0.50 * max_hr, 0.60 * max_hr),
            "Zone 2 (Aerobic)":   (0.60 * max_hr, 0.70 * max_hr),
            "Zone 3 (Tempo)":     (0.70 * max_hr, 0.80 * max_hr),
            "Zone 4 (Threshold)": (0.80 * max_hr, 0.90 * max_hr),
            "Zone 5 (Max)":       (0.90 * max_hr, max_hr),
        }

    print(f"Age: {age}, Max HR: {max_hr:.0f} bpm, Method: {method}")
    for name, (lo, hi) in zones.items():
        print(f"  {name}: {lo:.0f} - {hi:.0f} bpm")
    return zones

calculate_hr_zones(age=30, resting_hr=65, method="karvonen")

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.