# Get dates when a satellite has performed maneuver from historical TLE data (python)?

I have been recently acquainted with orbital mechanics and am trying to do some analysis on the subject. Since I don't have subject matter expertise, I am at a crossroads with trying to decide that how would one determine if a satellite has performed maneuver/rendezvous operation given the historical TLE data of that satellite from which we can extract the orbital elements.

Basically, as an input I have a historical TLE data for a satellite since launch. I am able to extract and/or compute any orbital parameters if needed. As an output, I want it to spit out the dates when the satellite performed maneuvers. The way I have been approaching this problem is: I take a subset of parameters extracted from the TLE data (as a time series data) and calculate long term standardized anomalies for each of those parameters. And then filter out dates when any one of those parameters had values greater than 1.5 or less than -1.5.

But there are two problems that I am facing: Firstly, I am not too sure of the parameter subset that I have chosen. And secondly, I am not sure if this is the correct way of approaching this problem. Is there any sophisticated way that people use to solve my problem?

What I'm interested in, is to find out the days when a satellite has performed maneuvers.

For Python and TLE propagation using SGP4 one very handy option is https://rhodesmill.org/skyfield/

As you probably already know a TLE is a strange animal. It does not really contain proper orbital elements, but instead is engineered with one purpose; to be fed into SGP4 so that that will generate reasonable position information for at least a few days around the TLE's epoch. See @Tristan's answer to Is SGP4 propagation necessarily more accurate near the epoch chosen for TLE generation? and answers to How to obtain UTC of the epoch time in a satellite TLE (two line element)? and How does SGP4 work? for more on that.

SGP4 includes approximations for several effects beyond Keplerian orbits, including a modest "lumpy gravity" model for Earth, continuous atmospheric drag, and gravitational perturbations from the Sun and Moon. For more on that last one see answers to SGP 4 for Geostationary Satellite and How do "Deep space" corrections in SGP4 account for the Sun's and Moon's gravity? and SGP4 on Systems Tool Kit (STK); how to check if SDP4 deep space correction is implemented? and maybe Differences between SGP8 and the standard SGP4? Is it ever used in practice?

From these I would like to convince you that a direct interpretation of the numerical values in the TLEs should be taken with several grains of salt. Large, sudden changes in mean anomaly (especially to higher orbits) or in inclination from one TLE to the next might indeed indicate a propulsive maneuver, but smaller changes could indicate a change in atmospheric temperature and density in LEO due to solar activity or even a mixture of noisy individual position and velocity measurements from satellite tracking (radar, visual/telescope).

So I think it will be very difficult to flag a propulsive maneuver with certainty and distinguish it from day-to-day noise in TLEs unless it is large or unless one group of TLEs are inconsistent with a following group of TLEs.

To that end, what you can do is for each TLE use SGP4 to predict a position and velocity at the epoch dates and times of several TLEs before and after it, say within a few day or week-long interval around the given TLE's epoch. If you see a clear inconsistency over several TLEs that might warrant further investigation.

For more background before you start that, see

• Thanks for the shoutout! I might add: there are a few things you can watch -- if you graph progressive TLEs and look for step changes above the normal variation. First off: don't bother with mean anomaly at epoch. It's a function of the time the TLE is based around. If the eccentricity is very low, I would also not bother with the argument of perigee, as it will swing wildly with perturbations. Look for changes in inclination, RAAN (for nonzero inclination), eccentricity, and mean motion. Note that there will be natural variation in most of these, so watch for step changes. Commented Jun 16, 2020 at 1:48
• To add a bit of clarification: RAAN is to inclination what argument of perigee is to eccentricity. When inclination and eccentricity are small, RAAN and argument of perigee respectively become very unstable and will swing wildly with very small changes to the state vector. Commented Jun 16, 2020 at 1:50
• Thank you for the detailed response. Highly appreciate it! @Tristan But I still don't have a clear vision on a few aspects of the answer. Basically, my end goal is to automate this process. Given any satellite of interest and all it's historical TLEs, I want to know the dates when it has performed maneuver. Now the query satellite can be in any orbit having any eccentricity or inclination. Is there a standardized automated way in which I can compute these anomalies in Python dynamically? Commented Jun 16, 2020 at 23:03
• @aashayshah So you've gotten information on what values to watch. What you are looking for now is how to programatically determine, given a time-varying series of values, how to detect the location of an anomalous variation. It's after midnight here, so instead of typing an answer, I will give you a hint -> At that point, it's no longer a space exploration question, just a programming question: how do you write a program to find a bump on an otherwise smooth time series plot, given tabulated data? Commented Jun 17, 2020 at 5:12
• @Tristan related: Is this what station keeping maneuvers look like, or just glitches in data? (SOHO via Horizons) (see 2nd and 3rd differences) and Detecting propulsive maneuvers in a table of state vectors (currently unanswered) and somewhat related: Unravelling Cassini's “ball of yarn” orbit around Saturn, tabulation of propulsive maneuvers? I think it would be okay to finish this here in SE; OP is looking for a special kind of bump...
– uhoh
Commented Jun 17, 2020 at 5:26