**The keyframes are not enumerated to frame.** [Commented on another question of yours](https://blender.stackexchange.com/questions/227385/re-align-imported-animation-keyframes-to-blender-frames#comment383606_227385) that there is no necessity that the keyframes are in frame order. _Feel some of this answer could be there or vice versa_ For the 2D keyframe point coordinate vector `x` is the frame, and y is the value `y` . Both are floats. The frame does not necessarily have to be exactly on a keyframe. For example may be from an imported `bvh` animation with a differing frame rate. To crop based on the frame of the keyframe point import bpy def crop_animation(action, frame_start, frame_end): """ Crop the given action keyframes by removing all keyframes before frame_start and after frame_end """ fcurves = action.fcurves for fcu in fcurves: for kf in fcu.keyframe_points: if kf.co.x < frame_start or kf.co.x > frame_end: fcu.keyframe_points.remove(kf) # test call crop_animation(bpy.data.actions[0], 10000, 0) _Not sure how you get the keyframe not in fcurve error using code in question._ . **Copy it.** Have added a related link below re copying and cropping fcurves. To make your fcurve such that the kf's fall on integer frames would make a copy, then over it's integer range. For example if `fc` is our original, then the points of our new curve could be [(frame, fc.evaluate(frame) for frame in range(frame_start, frame_end)] For bvh animation as displayed in other question with constant spacing between keyframes Another option is to scale the animation such that between frame distance is 1. Related. https://blender.stackexchange.com/questions/86822/how-to-change-an-fcurve-value-in-python/86825#86825 https://blender.stackexchange.com/questions/214866/copying-specific-frames-from-one-action-to-another-python https://blender.stackexchange.com/questions/190340/python-how-to-find-a-point-on-the-timeline-where-fcurve-reaches-a-certain-value/190350#190350