diff --git a/movement/kinematics/kinematics.py b/movement/kinematics/kinematics.py index 523482717..0a3de53e7 100644 --- a/movement/kinematics/kinematics.py +++ b/movement/kinematics/kinematics.py @@ -54,6 +54,13 @@ def compute_time_derivative(data: xr.DataArray, order: int) -> xr.DataArray: if order <= 0: raise logger.error(ValueError("Order must be a positive integer.")) validate_dims_coords(data, {"time": []}) + if data.sizes.get("time", 0) < 2: + raise logger.error( + ValueError( + "Cannot compute the time derivative of data with fewer than 2 " + "time frames." + ) + ) result = data for _ in range(order): result = result.differentiate("time") diff --git a/tests/test_unit/test_kinematics/test_kinematics.py b/tests/test_unit/test_kinematics/test_kinematics.py index 8cdfc46d3..9596592ee 100644 --- a/tests/test_unit/test_kinematics/test_kinematics.py +++ b/tests/test_unit/test_kinematics/test_kinematics.py @@ -180,6 +180,18 @@ def test_time_derivative_with_invalid_order(order, expected_exception): kinematics.compute_time_derivative(data, order=order) +def test_time_derivative_single_frame(): + """Test error is raised when input data has fewer than 2 frames.""" + data = xr.DataArray( + np.zeros((1, 2)), dims=["time", "space"], coords={"time": [1]} + ) + with pytest.raises( + ValueError, + match="Cannot compute the time derivative.*fewer than 2 time frames", + ): + kinematics.compute_time_derivative(data, order=1) + + time_points_value_error = pytest.raises( ValueError, match="At least 2 time points are required to compute path length",