Overview
The fastf1.utils module provides utility functions for common operations in FastF1, including time conversions, delta time calculations, and recursive dictionary access.
Functions
to_timedelta()
fastf1.utils.to_timedelta(x)
Fast timedelta object creation from a time string.
Parameters:
x (str | datetime.timedelta): Timestamp string or timedelta object
Returns:
datetime.timedelta | None: Parsed timedelta object or None if parsing fails
Permissible String Formats:
For example: 13:24:46.320215 with:
- Optional hours and minutes
- Optional microseconds and milliseconds with arbitrary precision (1 to 6 digits)
Examples of valid formats:
24.3564 - seconds + milli/microseconds
36:54 - minutes + seconds
8:45:46 - hours, minutes, seconds
Example:
import fastf1.utils as utils
# Parse a lap time
lap_time = utils.to_timedelta("1:23.456")
print(lap_time) # 0:01:23.456000
# Parse seconds only
sector_time = utils.to_timedelta("28.345")
print(sector_time) # 0:00:28.345000
to_datetime()
fastf1.utils.to_datetime(x)
Fast datetime object creation from a date string.
Parameters:
x (str | datetime.datetime): Timestamp string or datetime object
Returns:
datetime.datetime | None: Parsed datetime object or None if parsing fails
Permissible String Formats:
For example: 2020-12-13T13:27:15.320000Z with:
- Optional milliseconds and microseconds with arbitrary precision (1 to 6 digits)
- Optional trailing letter ‘Z’
Examples of valid formats:
2020-12-13T13:27:15.320000
2020-12-13T13:27:15.32Z
2020-12-13T13:27:15
Example:
import fastf1.utils as utils
# Parse session timestamp
session_time = utils.to_datetime("2023-03-05T15:30:00Z")
print(session_time) # 2023-03-05 15:30:00
# Parse with microseconds
precise_time = utils.to_datetime("2023-03-05T15:30:00.123456")
print(precise_time) # 2023-03-05 15:30:00.123456
delta_time()
fastf1.utils.delta_time(reference_lap, compare_lap)
This function is deprecated since version 3.0.0 and may be modified or removed in a future release due to accuracy concerns.
This function has a tendency to give inaccurate results. Always verify the result against sector time differences.
Calculates the delta time of a given lap, along the ‘Distance’ axis of the reference lap.
Parameters:
reference_lap (fastf1.core.Lap): The lap taken as reference
compare_lap (fastf1.core.Lap): The lap to compare
Returns:
tuple[pd.Series, fastf1.core.Telemetry, fastf1.core.Telemetry]: A tuple containing:
pd.Series of type float64 with the delta in seconds
- Telemetry for the reference lap
- Telemetry for the comparison lap
Use the returned telemetry for plotting to ensure you have telemetry data that was created with the same interpolation and resampling options.
Example:
import fastf1 as ff1
from fastf1 import plotting, utils
from matplotlib import pyplot as plt
plotting.setup_mpl(color_scheme='fastf1')
session = ff1.get_session(2021, 'Emilia Romagna', 'Q')
session.load()
lec = session.laps.pick_drivers('LEC').pick_fastest()
ham = session.laps.pick_drivers('HAM').pick_fastest()
delta_time, ref_tel, compare_tel = utils.delta_time(ham, lec)
fig, ax = plt.subplots()
ax.plot(ref_tel['Distance'], ref_tel['Speed'],
color=plotting.get_team_color(ham['Team'], session))
ax.plot(compare_tel['Distance'], compare_tel['Speed'],
color=plotting.get_team_color(lec['Team'], session))
twin = ax.twinx()
twin.plot(ref_tel['Distance'], delta_time, '--', color='white')
twin.set_ylabel("<-- Lec ahead | Ham ahead -->")
plt.show()
recursive_dict_get()
fastf1.utils.recursive_dict_get(d, *keys, default_none=False)
Recursive dict get. Can take an arbitrary number of keys and returns an empty dict if any key does not exist.
Parameters:
d (dict): The dictionary to traverse
*keys (str): Variable number of keys to traverse
default_none (bool, optional): If True, return None instead of empty dict when key doesn’t exist. Default is False.
Returns:
- The value at the nested key path, or
{} (or None if default_none=True) if any key doesn’t exist
Example:
from fastf1.utils import recursive_dict_get
data = {
'session': {
'weather': {
'temperature': 25,
'humidity': 60
}
}
}
# Get nested value
temp = recursive_dict_get(data, 'session', 'weather', 'temperature')
print(temp) # 25
# Missing key returns empty dict
missing = recursive_dict_get(data, 'session', 'track', 'length')
print(missing) # {}
# Or return None instead
missing = recursive_dict_get(data, 'session', 'track', 'length', default_none=True)
print(missing) # None