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.