Extremely precise calculation of the EoT (Equation of Time) isn't easy. You need to include the effects of the perturbations by other bodies on the motion of the Earth, especially the Moon, and as I've mentioned numerous times, lunar theory is complicated. ;)
Although the primary focus of your question is the EoT, I think it's appropriate to digress briefly to discuss the perihelion.
The variation in the exact time of perihelion passage doesn't have too much of an effect on the EoT. That's because we don't use the argument of perihelion as a point of reference. Traditionally, we use the equinox point, aka the First point of Aries. Modern approaches use the ICRF (International Celestial Reference Frame).
The Earth's orbit around the Sun is approximately a Keplerian ellipse. A better approximation considers the EMB, the Earth-Moon barycentre (their centre of mass), as the entity orbiting the Sun, and then we look at the orbit of the Earth and Moon around that barycentre.
The EMB is located inside the Earth, but its distance from the centre of the Earth varies with monthly, annual, and longer cycles.
Here's a daily plot of the distance between the centre of the Earth and the EMB, produced using JPL Horizons. We see that the maximum variation occurs around perihelion and aphelion. (The mean distance in that plot is ~4678.1 km). That is, the orbital radius of the Earth-Moon system varies depending on the distance to the Sun.
Here's a plot of the distance between the EMB and the Sun for the year 2000. The perihelion distance is ~147.1 million km, the aphelion distance is ~152.1 million km, so the difference between them is ~5 million km, which is more than a thousand times greater than the mean Earth-EMB distance.
Near perihelion, the EMB-Sun distance doesn't change much, but the Earth's orbital speed is near its maximum. So the exact time of Earth's perihelion can vary quite a bit depending on Earth's position in its orbit around the EMB.
However, the time of the perihelion passage of the EMB is much more stable. So the general orientation of the EMB's orbit around the Sun, and the variation in the EMB-Sun distance caused by eccentricity is also more stable than what you might assume from the variation in the time of the perihelion passage of the Earth itself.
The largest error in using a "generic" table of EoT values is due to the fractional part of the year. But you can adjust for that by subtracting a ¼ day for each year in the leap year cycle and interpolating.
That graph in the question was created using simple EoT equations (see here for details), similar to my graphs here, which were created using the crude equations from Wikipedia, for the year 2000.
Here's a fairly accurate EoT component graph (using the same color scheme), using 4 day steps for midday at the location of the Greenwich Observatory. The EoT curve (in red) was produced using Horizons, so it's about as accurate as you can get. The obliquity (purple) and eccentricity (blue) components were computed using an algorithm I cobbled together using equations from The Equation of Time by Hughes, Yallop, & Hohenkerk (1989) doi: 10.1093/mnras/238.4.1529 combined with more recent equations for sidereal time and obliquity from JPL. The full form of my algorithm matches Horizons' values to within 1 second in years near 2000, and is still quite close for several centuries either side of that date.
I should mention that the red EoT curve isn't exactly the sum of the two component curves. There's a non-linear interaction between the two components, but it's fairly small because the eccentricity of the Earth's orbit is fairly small.
Here's a version covering a decade. Apart from the effect of the leapyear cycle, it's not easy to see any variation from year to year.
Here's a graph of the rate of change of the EoT and its components for the year 2000, created by differentiating the crude equations from Wikipedia. It clearly shows that the obliquity has much more influence than the eccentricity does on the change in solar day length.
Here's a plot of my EoT values minus Horizons' values, using a 1 day step. As you can see, the difference is less than 1 second.
Here's my Python EoT function.
""" The Equation of Time
References:
The Horizons manual
https://ssd.jpl.nasa.gov/horizons/manual.html#greenwich-mean-sidereal-time
The JPL Planetary and Lunar Ephemerides DE440 and DE441
Park et al (2021)
https://doi.org/10.3847/1538-3881/abd414
Equation of Time
Hughes, Yallop, & Hohenkerk (1989)
https://doi.org/10.1093/mnras/238.4.1529
Written by PM 2Ring 2022.05.13
Updated 2022.06.10
"""
from math import radians, degrees, sin, cos, atan2
j2000_epoch = 2451545.0
def dms_to_s(d, m, s):
return 3600 * d + 60 * m + s
def poly(coeff, x):
""" Evaluate a polynomial using Horner's rule
coeff[0] is the constant term
"""
it = reversed(coeff)
v = next(it)
for u in it:
v = v * x + u
return v
# Omega (mean ecliptic longitude of the Moon's ascending node)
# coefficients in arcsecs, T in Julian centuries
# From Park et al (2021)
omega_coeff = [
dms_to_s(125, 2, 40.280),
-dms_to_s(1934, 8, 10.539),
7.455, 0.008,
]
# Compute various solar values
# Mean longitude, mean anomaly, ecliptic longitude, eccentricity,
# Right Ascension, Obliquity of the ecliptic, sidereal time,
# Equation of Time
def eqn_of_time(jdn):
# Time in Julian centuries since Noon 1 Jan 2000
T = (jdn - j2000_epoch) / 36525
# Greenwich Mean Sidereal Time at midnight, in seconds
# From Horizons. T is UT1, not TT
gmst = poly((67310.548, 8640184.812866, 0.093104, -6.2e-6), T)
# Adjust T to TT
deltaT = (-3.36 + 1.35 * (T + 2.33)**2) * 1e-8
# print("delta T", deltaT * 36525 * 86400)
T += deltaT
# Mean longitude
L = poly((280.46607, 36000.76980, 3.025e-4), T)
# Mean anomaly
g = 357.528 + 35999.0503 * T
gr = radians(g)
# Eccentricity
ec = poly((0.016708634, -4.2037e-5, -1.267e-7), T)
# Equation of the centre
Cr = 2 * ec * sin(gr) + 1.25 * ec * ec * sin(2 * gr)
C = degrees(Cr)
# Correct for mean aberration & nutation in longitude
aberration = 20.49552
omega = poly(omega_coeff, T) / 3600
omega_r = radians(omega % 360)
perturb = (aberration + 17.1996 * sin(omega_r)) / 3600
# Ecliptic longitude.
el = (L + C - perturb) % 360
elr = radians(el)
# Obliquity of the ecliptic.
# From JPL, via https://en.wikipedia.org/wiki/Ecliptic#Obliquity_of_the_ecliptic
# Coefficients in arcsecs
coeff = (84381.406, -46.836769, -1.831e-4, 2.0034e-3, -5.76e-7, -4.34e-8)
oe = poly(coeff, T) / 3600
oer = radians(oe)
# Right Ascension
rar = atan2(sin(elr) * cos(oer), cos(elr))
ra = degrees(rar) % 360
# Equation of Time in seconds
eot = (43200 + gmst - ra * 240) % 86400 - 43200
return eot
Here's an EoT table for Greenwich, calculated using Horizons, not the above code.
Equation of Time from 2022-Jan-1 to 2023-Jan-1
Zone date & time, EoT (seconds)
2022-Jan-01 12:00, -212.403
2022-Jan-02 12:00, -240.575
2022-Jan-03 12:00, -268.394
2022-Jan-04 12:00, -295.824
2022-Jan-05 12:00, -322.829
2022-Jan-06 12:00, -349.377
2022-Jan-07 12:00, -375.437
2022-Jan-08 12:00, -400.980
2022-Jan-09 12:00, -425.981
2022-Jan-10 12:00, -450.415
2022-Jan-11 12:00, -474.258
2022-Jan-12 12:00, -497.490
2022-Jan-13 12:00, -520.091
2022-Jan-14 12:00, -542.043
2022-Jan-15 12:00, -563.328
2022-Jan-16 12:00, -583.932
2022-Jan-17 12:00, -603.839
2022-Jan-18 12:00, -623.038
2022-Jan-19 12:00, -641.517
2022-Jan-20 12:00, -659.266
2022-Jan-21 12:00, -676.276
2022-Jan-22 12:00, -692.538
2022-Jan-23 12:00, -708.045
2022-Jan-24 12:00, -722.790
2022-Jan-25 12:00, -736.766
2022-Jan-26 12:00, -749.968
2022-Jan-27 12:00, -762.390
2022-Jan-28 12:00, -774.024
2022-Jan-29 12:00, -784.865
2022-Jan-30 12:00, -794.906
2022-Jan-31 12:00, -804.139
2022-Feb-01 12:00, -812.559
2022-Feb-02 12:00, -820.160
2022-Feb-03 12:00, -826.938
2022-Feb-04 12:00, -832.892
2022-Feb-05 12:00, -838.022
2022-Feb-06 12:00, -842.329
2022-Feb-07 12:00, -845.818
2022-Feb-08 12:00, -848.495
2022-Feb-09 12:00, -850.365
2022-Feb-10 12:00, -851.438
2022-Feb-11 12:00, -851.724
2022-Feb-12 12:00, -851.232
2022-Feb-13 12:00, -849.976
2022-Feb-14 12:00, -847.967
2022-Feb-15 12:00, -845.220
2022-Feb-16 12:00, -841.750
2022-Feb-17 12:00, -837.573
2022-Feb-18 12:00, -832.705
2022-Feb-19 12:00, -827.163
2022-Feb-20 12:00, -820.966
2022-Feb-21 12:00, -814.131
2022-Feb-22 12:00, -806.675
2022-Feb-23 12:00, -798.616
2022-Feb-24 12:00, -789.971
2022-Feb-25 12:00, -780.756
2022-Feb-26 12:00, -770.987
2022-Feb-27 12:00, -760.679
2022-Feb-28 12:00, -749.845
2022-Mar-01 12:00, -738.499
2022-Mar-02 12:00, -726.655
2022-Mar-03 12:00, -714.327
2022-Mar-04 12:00, -701.529
2022-Mar-05 12:00, -688.277
2022-Mar-06 12:00, -674.585
2022-Mar-07 12:00, -660.473
2022-Mar-08 12:00, -645.957
2022-Mar-09 12:00, -631.056
2022-Mar-10 12:00, -615.790
2022-Mar-11 12:00, -600.179
2022-Mar-12 12:00, -584.243
2022-Mar-13 12:00, -568.004
2022-Mar-14 12:00, -551.484
2022-Mar-15 12:00, -534.703
2022-Mar-16 12:00, -517.687
2022-Mar-17 12:00, -500.456
2022-Mar-18 12:00, -483.037
2022-Mar-19 12:00, -465.452
2022-Mar-20 12:00, -447.727
2022-Mar-21 12:00, -429.884
2022-Mar-22 12:00, -411.950
2022-Mar-23 12:00, -393.945
2022-Mar-24 12:00, -375.893
2022-Mar-25 12:00, -357.816
2022-Mar-26 12:00, -339.733
2022-Mar-27 12:00, -321.663
2022-Mar-28 12:00, -303.625
2022-Mar-29 12:00, -285.635
2022-Mar-30 12:00, -267.711
2022-Mar-31 12:00, -249.867
2022-Apr-01 12:00, -232.120
2022-Apr-02 12:00, -214.486
2022-Apr-03 12:00, -196.979
2022-Apr-04 12:00, -179.615
2022-Apr-05 12:00, -162.410
2022-Apr-06 12:00, -145.382
2022-Apr-07 12:00, -128.546
2022-Apr-08 12:00, -111.919
2022-Apr-09 12:00, -95.518
2022-Apr-10 12:00, -79.361
2022-Apr-11 12:00, -63.463
2022-Apr-12 12:00, -47.844
2022-Apr-13 12:00, -32.521
2022-Apr-14 12:00, -17.511
2022-Apr-15 12:00, -2.834
2022-Apr-16 12:00, +11.492
2022-Apr-17 12:00, +25.448
2022-Apr-18 12:00, +39.014
2022-Apr-19 12:00, +52.173
2022-Apr-20 12:00, +64.907
2022-Apr-21 12:00, +77.199
2022-Apr-22 12:00, +89.035
2022-Apr-23 12:00, +100.399
2022-Apr-24 12:00, +111.282
2022-Apr-25 12:00, +121.670
2022-Apr-26 12:00, +131.556
2022-Apr-27 12:00, +140.932
2022-Apr-28 12:00, +149.789
2022-Apr-29 12:00, +158.124
2022-Apr-30 12:00, +165.930
2022-May-01 12:00, +173.203
2022-May-02 12:00, +179.940
2022-May-03 12:00, +186.138
2022-May-04 12:00, +191.793
2022-May-05 12:00, +196.903
2022-May-06 12:00, +201.465
2022-May-07 12:00, +205.479
2022-May-08 12:00, +208.941
2022-May-09 12:00, +211.851
2022-May-10 12:00, +214.207
2022-May-11 12:00, +216.009
2022-May-12 12:00, +217.255
2022-May-13 12:00, +217.944
2022-May-14 12:00, +218.075
2022-May-15 12:00, +217.646
2022-May-16 12:00, +216.655
2022-May-17 12:00, +215.103
2022-May-18 12:00, +212.987
2022-May-19 12:00, +210.309
2022-May-20 12:00, +207.072
2022-May-21 12:00, +203.278
2022-May-22 12:00, +198.934
2022-May-23 12:00, +194.049
2022-May-24 12:00, +188.632
2022-May-25 12:00, +182.694
2022-May-26 12:00, +176.248
2022-May-27 12:00, +169.310
2022-May-28 12:00, +161.895
2022-May-29 12:00, +154.019
2022-May-30 12:00, +145.701
2022-May-31 12:00, +136.958
2022-Jun-01 12:00, +127.811
2022-Jun-02 12:00, +118.279
2022-Jun-03 12:00, +108.381
2022-Jun-04 12:00, +98.139
2022-Jun-05 12:00, +87.572
2022-Jun-06 12:00, +76.703
2022-Jun-07 12:00, +65.552
2022-Jun-08 12:00, +54.140
2022-Jun-09 12:00, +42.487
2022-Jun-10 12:00, +30.615
2022-Jun-11 12:00, +18.543
2022-Jun-12 12:00, +6.289
2022-Jun-13 12:00, -6.128
2022-Jun-14 12:00, -18.690
2022-Jun-15 12:00, -31.381
2022-Jun-16 12:00, -44.183
2022-Jun-17 12:00, -57.079
2022-Jun-18 12:00, -70.049
2022-Jun-19 12:00, -83.073
2022-Jun-20 12:00, -96.130
2022-Jun-21 12:00, -109.196
2022-Jun-22 12:00, -122.247
2022-Jun-23 12:00, -135.260
2022-Jun-24 12:00, -148.207
2022-Jun-25 12:00, -161.063
2022-Jun-26 12:00, -173.801
2022-Jun-27 12:00, -186.397
2022-Jun-28 12:00, -198.821
2022-Jun-29 12:00, -211.050
2022-Jun-30 12:00, -223.056
2022-Jul-01 12:00, -234.815
2022-Jul-02 12:00, -246.300
2022-Jul-03 12:00, -257.488
2022-Jul-04 12:00, -268.355
2022-Jul-05 12:00, -278.879
2022-Jul-06 12:00, -289.037
2022-Jul-07 12:00, -298.810
2022-Jul-08 12:00, -308.178
2022-Jul-09 12:00, -317.124
2022-Jul-10 12:00, -325.632
2022-Jul-11 12:00, -333.688
2022-Jul-12 12:00, -341.281
2022-Jul-13 12:00, -348.401
2022-Jul-14 12:00, -355.040
2022-Jul-15 12:00, -361.188
2022-Jul-16 12:00, -366.838
2022-Jul-17 12:00, -371.983
2022-Jul-18 12:00, -376.613
2022-Jul-19 12:00, -380.721
2022-Jul-20 12:00, -384.297
2022-Jul-21 12:00, -387.332
2022-Jul-22 12:00, -389.816
2022-Jul-23 12:00, -391.741
2022-Jul-24 12:00, -393.097
2022-Jul-25 12:00, -393.877
2022-Jul-26 12:00, -394.072
2022-Jul-27 12:00, -393.675
2022-Jul-28 12:00, -392.679
2022-Jul-29 12:00, -391.078
2022-Jul-30 12:00, -388.866
2022-Jul-31 12:00, -386.040
2022-Aug-01 12:00, -382.594
2022-Aug-02 12:00, -378.527
2022-Aug-03 12:00, -373.838
2022-Aug-04 12:00, -368.525
2022-Aug-05 12:00, -362.590
2022-Aug-06 12:00, -356.036
2022-Aug-07 12:00, -348.867
2022-Aug-08 12:00, -341.089
2022-Aug-09 12:00, -332.711
2022-Aug-10 12:00, -323.742
2022-Aug-11 12:00, -314.194
2022-Aug-12 12:00, -304.080
2022-Aug-13 12:00, -293.412
2022-Aug-14 12:00, -282.204
2022-Aug-15 12:00, -270.468
2022-Aug-16 12:00, -258.218
2022-Aug-17 12:00, -245.464
2022-Aug-18 12:00, -232.220
2022-Aug-19 12:00, -218.497
2022-Aug-20 12:00, -204.304
2022-Aug-21 12:00, -189.655
2022-Aug-22 12:00, -174.560
2022-Aug-23 12:00, -159.031
2022-Aug-24 12:00, -143.078
2022-Aug-25 12:00, -126.714
2022-Aug-26 12:00, -109.950
2022-Aug-27 12:00, -92.797
2022-Aug-28 12:00, -75.268
2022-Aug-29 12:00, -57.374
2022-Aug-30 12:00, -39.129
2022-Aug-31 12:00, -20.544
2022-Sep-01 12:00, -1.635
2022-Sep-02 12:00, +17.584
2022-Sep-03 12:00, +37.098
2022-Sep-04 12:00, +56.891
2022-Sep-05 12:00, +76.943
2022-Sep-06 12:00, +97.236
2022-Sep-07 12:00, +117.750
2022-Sep-08 12:00, +138.463
2022-Sep-09 12:00, +159.352
2022-Sep-10 12:00, +180.393
2022-Sep-11 12:00, +201.564
2022-Sep-12 12:00, +222.840
2022-Sep-13 12:00, +244.199
2022-Sep-14 12:00, +265.619
2022-Sep-15 12:00, +287.077
2022-Sep-16 12:00, +308.553
2022-Sep-17 12:00, +330.025
2022-Sep-18 12:00, +351.475
2022-Sep-19 12:00, +372.881
2022-Sep-20 12:00, +394.226
2022-Sep-21 12:00, +415.488
2022-Sep-22 12:00, +436.651
2022-Sep-23 12:00, +457.695
2022-Sep-24 12:00, +478.603
2022-Sep-25 12:00, +499.356
2022-Sep-26 12:00, +519.938
2022-Sep-27 12:00, +540.332
2022-Sep-28 12:00, +560.520
2022-Sep-29 12:00, +580.486
2022-Sep-30 12:00, +600.213
2022-Oct-01 12:00, +619.683
2022-Oct-02 12:00, +638.878
2022-Oct-03 12:00, +657.778
2022-Oct-04 12:00, +676.363
2022-Oct-05 12:00, +694.613
2022-Oct-06 12:00, +712.505
2022-Oct-07 12:00, +730.017
2022-Oct-08 12:00, +747.125
2022-Oct-09 12:00, +763.806
2022-Oct-10 12:00, +780.036
2022-Oct-11 12:00, +795.793
2022-Oct-12 12:00, +811.054
2022-Oct-13 12:00, +825.798
2022-Oct-14 12:00, +840.003
2022-Oct-15 12:00, +853.651
2022-Oct-16 12:00, +866.721
2022-Oct-17 12:00, +879.196
2022-Oct-18 12:00, +891.058
2022-Oct-19 12:00, +902.289
2022-Oct-20 12:00, +912.875
2022-Oct-21 12:00, +922.799
2022-Oct-22 12:00, +932.048
2022-Oct-23 12:00, +940.608
2022-Oct-24 12:00, +948.467
2022-Oct-25 12:00, +955.615
2022-Oct-26 12:00, +962.042
2022-Oct-27 12:00, +967.738
2022-Oct-28 12:00, +972.697
2022-Oct-29 12:00, +976.909
2022-Oct-30 12:00, +980.368
2022-Oct-31 12:00, +983.064
2022-Nov-01 12:00, +984.990
2022-Nov-02 12:00, +986.135
2022-Nov-03 12:00, +986.492
2022-Nov-04 12:00, +986.049
2022-Nov-05 12:00, +984.796
2022-Nov-06 12:00, +982.725
2022-Nov-07 12:00, +979.826
2022-Nov-08 12:00, +976.091
2022-Nov-09 12:00, +971.512
2022-Nov-10 12:00, +966.083
2022-Nov-11 12:00, +959.798
2022-Nov-12 12:00, +952.655
2022-Nov-13 12:00, +944.651
2022-Nov-14 12:00, +935.784
2022-Nov-15 12:00, +926.056
2022-Nov-16 12:00, +915.468
2022-Nov-17 12:00, +904.023
2022-Nov-18 12:00, +891.727
2022-Nov-19 12:00, +878.586
2022-Nov-20 12:00, +864.608
2022-Nov-21 12:00, +849.803
2022-Nov-22 12:00, +834.184
2022-Nov-23 12:00, +817.766
2022-Nov-24 12:00, +800.566
2022-Nov-25 12:00, +782.602
2022-Nov-26 12:00, +763.895
2022-Nov-27 12:00, +744.464
2022-Nov-28 12:00, +724.332
2022-Nov-29 12:00, +703.519
2022-Nov-30 12:00, +682.046
2022-Dec-01 12:00, +659.932
2022-Dec-02 12:00, +637.197
2022-Dec-03 12:00, +613.862
2022-Dec-04 12:00, +589.948
2022-Dec-05 12:00, +565.475
2022-Dec-06 12:00, +540.464
2022-Dec-07 12:00, +514.938
2022-Dec-08 12:00, +488.921
2022-Dec-09 12:00, +462.437
2022-Dec-10 12:00, +435.509
2022-Dec-11 12:00, +408.166
2022-Dec-12 12:00, +380.433
2022-Dec-13 12:00, +352.338
2022-Dec-14 12:00, +323.912
2022-Dec-15 12:00, +295.183
2022-Dec-16 12:00, +266.182
2022-Dec-17 12:00, +236.942
2022-Dec-18 12:00, +207.495
2022-Dec-19 12:00, +177.875
2022-Dec-20 12:00, +148.118
2022-Dec-21 12:00, +118.260
2022-Dec-22 12:00, +88.341
2022-Dec-23 12:00, +58.399
2022-Dec-24 12:00, +28.476
2022-Dec-25 12:00, -1.387
2022-Dec-26 12:00, -31.151
2022-Dec-27 12:00, -60.776
2022-Dec-28 12:00, -90.226
2022-Dec-29 12:00, -119.466
2022-Dec-30 12:00, -148.463
2022-Dec-31 12:00, -177.185
2023-Jan-01 12:00, -205.602
Here's a live version of the script, running on the SageMathCell server.
The start & stop times are for noon in the given time zone.
Dates must be given in YYYY-Mon-DD form, the step
can accept any of the usual Horizons time step forms, see the Horizons manual for details. If you prefer, here's the Horizons manual in glorious ASCII. ;)
The time zone
must be given as a plain integer or floating-point number, not in HH:MM format.
Select table
to get a printed table of results, as shown above.
Select show_approx
to see green dots calculated using the above eqn_of_time
function plotted on top of the main Horizons data.