Skyfield, like most other tools that claim the ability to process TLE data, depends on a bunch of people's educated but aged guesses about what SGP4 might have been doing some time ago, rather than giving access to what SGP4 actually does right now. This made sense for a long time because there was no other way for most people to get hold of SGP4, but happily that is no longer the case. Anyone who registers for a free account can now download the official US government implementation of SGP4 and associated utilities, some of which were significantly updated in November 2020, from https://www.space-track.org/documentation#/sgp4 .
To see the code I'm talking about below, you have to agree to the SGP4 open source license restrictions (which will pop up when you click the download link, and are later available for your reference as \Sgp4Prop_small\SampleCode\*\SGP4_Open_License.txt), download that file, unzip it, and look at the contents of Sgp4Prop_small\SampleCode\Python\wrappers\ and Sgp4Prop_small\SampleCode\Python\DriverExamples\Sgp4Prop\src\ . Wrapper code is also provided in C, C#, Fortran, Java, Matlab, and Visual Basic, (the actual libraries are provided as DLLs for Windows and .so's for Linux) but you asked about Python so I'll describe it all from the Python point of view.
As part of that update, the provided Python wrapper has finally changed from Python 2 to Python 3 (Sgp4Prop.py as included with library versions up through 7.9, unchanged since January 2013 but still being distributed in October 2020, crashed under Python 3 because it wasn't using parentheses in print statements, among other basic flaws). Personally, I stick in a few tweaks of my own that I think make the libraries easier to use, like adding an empty __init__.py to the directory and prepending dots to convert the library wrappers' calls to each other from absolute to relative imports, but that's entirely optional and not part of the official distribution, which is all I'm going to detail at the moment.
The one distinctly non-Pythonic thing to contend with is that the interface provided by the default wrappers follows the old C and Fortran style exactly, so all the functions only return an integer status code. The data comes back as written into structures you must pre-declare using ctypes and provide as input arguments, which isn't hard but is very much not the way Python is typically used. It's quite possible to hide all of that by writing your own wrappers, which I have done for myself but not yet made available to anyone outside work.
The task of converting a TLE into a table of osculating Keplerian elements in the best available way, using as correctly as possible everything SGP4 models, is one of the basic things shown as an example in the demonstration script, Sgp4Prop_small\SampleCode\Python\DriverExamples\Sgp4Prop\src\Sgp4Prop.py . That script makes the unfortunate choice (line 129 calls TimeFunc.TConLoadFile) of wanting you to supply the start, stop, and step times for the file in the painfully archaic and needlessly confusing "6P card" format (e.g. , as described on pages 7–9 of Sgp4Prop_small\Documents\librarydocuments\TimeFunc.doc), but the TimeFunc library provides all the necessary conversion functions to generate the time format the propagator wants to receive (decimal days since 1950, UTC) from whatever other time data you may have.