Epoch examples¶
Let’s define a small helper function:
def print_me(msg, val):
print("{}: {}".format(msg, val))
Let’s start creating and Epoch object, and printing it:
e = Epoch(1987, 6, 19.5)
print_me("JDE for 1987/6/19.5", e)
# JDE for 1987/6/19.5: 2446966.00064
Redefine the Epoch object:
e.set(333, 'Jan', 27, 12)
print_me("JDE for 333/1/27.5", e)
# JDE for 333/1/27.5: 1842713.0
We can create an Epoch from a date
or datetime
object:
d = datetime.datetime(837, 4, 10, 7, 12, 0, 0)
f = Epoch(d)
print_me("JDE for 837/4/10.3", f)
# JDE for 837/4/10.3: 2026871.8
Let’s check if a given date belong to the Julian or the Gregorian calendar:
print_me("Is 1590/4/21.4 a Julian date?", Epoch.is_julian(1590, 4, 21.4))
# Is 1590/4/21.4 a Julian date?: False
We can also check if a given year is leap or not:
print_me("Is -1000 a leap year?", Epoch.is_leap(-1000))
# Is -1000 a leap year?: True
print_me("Is 1800 a leap year?", Epoch.is_leap(1800))
# Is 1800 a leap year?: False
print_me("Is 2012 a leap year?", Epoch.is_leap(2012))
# Is 2012 a leap year?: True
Get the Day Of Year (DOY) corresponding to a given date:
print_me("Day Of Year (DOY) of 1978/11/14", Epoch.get_doy(1978, 11, 14))
# Day Of Year (DOY) of 1978/11/14: 318.0
print_me("Day Of Year (DOY) of -400/2/29.9", Epoch.get_doy(-400, 2, 29.9))
# Day Of Year (DOY) of -400/2/29.9: 60.9
Now the opposite: Get a date from a DOY:
t = Epoch.doy2date(2017, 365.7)
s = str(t[0]) + "/" + str(t[1]) + "/" + str(round(t[2], 2))
print_me("Date from DOY 2017:365.7", s)
# Date from DOY 2017:365.7: 2017/12/31.7
t = Epoch.doy2date(-4, 60)
s = str(t[0]) + "/" + str(t[1]) + "/" + str(round(t[2], 2))
print_me("Date from DOY -4:60", s)
# Date from DOY -4:60: -4/2/29.0
There is an internal table which we can use to get the leap seconds:
print_me("Number of leap seconds applied up to July 1983", Epoch.leap_seconds(1983, 7))
# Number of leap seconds applied up to July 1983: 12
We can convert the internal JDE value back to a date:
e = Epoch(2436116.31)
y, m, d = e.get_date()
s = str(y) + "/" + str(m) + "/" + str(round(d, 2))
print_me("Date from JDE 2436116.31", s)
# Date from JDE 2436116.31: 1957/10/4.81
It is possible to get the day of the week corresponding to a given date:
e = Epoch(2018, 'Feb', 15)
print_me("The day of week of 2018/2/15 is", e.dow(as_string=True))
# The day of week of 2018/2/15 is: Thursday
In some cases it is useful to get the Modified Julian Day (MJD):
e = Epoch(1923, 'August', 23)
print_me("Modified Julian Day for 1923/8/23", round(e.mjd(), 2))
# Modified Julian Day for 1923/8/23: 23654.0
If your system is appropriately configured, you can get the difference in seconds between your local time and UTC:
print_me("From local system time to UTC you must add/subtract" +
" this amount of seconds", Epoch.utc2local())
# From local system time to UTC you must add/subtract this amount of seconds: 7200.0
Compute DeltaT = TT - UT differences for various dates:
print_me("DeltaT (TT - UT) for Feb/333", round(Epoch.tt2ut(333, 2), 1))
# DeltaT (TT - UT) for Feb/333: 7358.5
print_me("DeltaT (TT - UT) for Jan/1642", round(Epoch.tt2ut(1642, 1), 1))
# DeltaT (TT - UT) for Jan/1642: 62.1
print_me("DeltaT (TT - UT) for Feb/1928", round(Epoch.tt2ut(1928, 1), 1))
# DeltaT (TT - UT) for Feb/1928: 24.2
print_me("DeltaT (TT - UT) for Feb/1977", round(Epoch.tt2ut(1977, 2), 1))
# DeltaT (TT - UT) for Feb/1977: 47.7
print_me("DeltaT (TT - UT) for Jan/1998", round(Epoch.tt2ut(1998, 1), 1))
# DeltaT (TT - UT) for Jan/1998: 63.0
The difference between civil day and sidereal day is almost 4 minutes:
e = Epoch(1987, 4, 10)
st1 = round(e.mean_sidereal_time(), 9)
e = Epoch(1987, 4, 11)
st2 = round(e.mean_sidereal_time(), 9)
ds = (st2 - st1)*DAY2MIN
msg = "{}m {}s".format(INT(ds), (ds % 1)*60.0)
print_me("Difference between sidereal time 1987/4/11 and 1987/4/10", msg)
# Difference between sidereal time 1987/4/11 and 1987/4/10: 3m 56.555424s
When correcting for nutation-related effects, we get the apparent sidereal time:
e = Epoch(1987, 4, 10)
print_me("e.apparent_sidereal_time(23.44357, (-3.788)/3600.0)",
e.apparent_sidereal_time(23.44357, (-3.788)/3600.0))
# e.apparent_sidereal_time(23.44357, (-3.788)/3600.0): 0.549145082637
Epoch class can also provide the date of Easter for a given year. Let’s spice up the output a little bit, calling dow()
and get_month()
:
month, day = Epoch.easter(2019)
e = Epoch(2019, month, day)
s = e.dow(as_string=True) + ", " + str(day) + get_ordinal_suffix(day) + \
" of " + Epoch.get_month(month, as_string=True)
print_me("Easter day for 2019", s)
# Easter day for 2019: Sunday, 21st of April
Compute the date of the Jewish Easter (Pesach) for a given year:
month, day = Epoch.jewish_pesach(1990)
s = str(day) + get_ordinal_suffix(day) + " of " + Epoch.get_month(month, as_string=True)
print_me("Jewish Pesach day for 1990", s)
# Jewish Pesach day for 1990: 10th of April
Now, let’s convert a date in the Moslem calendar to the Gregorian calendar:
y, m, d = Epoch.moslem2gregorian(1421, 1, 1)
print_me("The date 1421/1/1 in the Moslem calendar is, in Gregorian " +
"calendar", "{}/{}/{}".format(y, m, d))
# The date 1421/1/1 in the Moslem calendar is, in Gregorian calendar: 2000/4/6
y, m, d = Epoch.moslem2gregorian(1439, 9, 1)
print_me("The start of Ramadan month (9/1) for Gregorian year 2018 is",
"{}/{}/{}".format(y, m, d))
# The start of Ramadan month (9/1) for Gregorian year 2018 is: 2018/5/16
We can go from the Gregorian calendar back to the Moslem calendar too:
print_me("Date 1991/8/13 in Gregorian calendar is, in Moslem calendar",
"{}/{}/{}".format(*Epoch.gregorian2moslem(1991, 8, 13)))
# Date 1991/8/13 in Gregorian calendar is, in Moslem calendar: 1412/2/2
Note
The *
before Epoch
will unpack the tuple into components
It is possible to carry out some algebraic operations with Epochs.
Add 10000 days to a given date:
a = Epoch(1991, 7, 11) b = a + 10000 y, m, d = b.get_date() s = str(y) + "/" + str(m) + "/" + str(round(d, 2)) print_me("1991/7/11 plus 10000 days is", s) # 1991/7/11 plus 10000 days is: 2018/11/26.0
Subtract two Epochs to find the number of days between them:
a = Epoch(1986, 2, 9.0) b = Epoch(1910, 4, 20.0) print_me("The number of days between 1986/2/9 and 1910/4/20 is", round(a - b, 2)) # The number of days between 1986/2/9 and 1910/4/20 is: 27689.0
We can also subtract a given amount of days from an Epoch:
a = Epoch(2003, 12, 31.0) b = a - 365.5 y, m, d = b.get_date() s = str(y) + "/" + str(m) + "/" + str(round(d, 2)) print_me("2003/12/31 minus 365.5 days is", s) # 2003/12/31 minus 365.5 days is: 2002/12/30.5
Accumulative addition and subtraction of days is also allowed:
a = Epoch(2003, 12, 31.0) a += 32.5 y, m, d = a.get_date() s = str(y) + "/" + str(m) + "/" + str(round(d, 2)) print_me("2003/12/31 plus 32.5 days is", s) # 2003/12/31 plus 32.5 days is: 2004/2/1.5 a = Epoch(2001, 12, 31.0) a -= 2*365 y, m, d = a.get_date() s = str(y) + "/" + str(m) + "/" + str(round(d, 2)) print_me("2001/12/31 minus 2*365 days is", s) # 2001/12/31 minus 2*365 days is: 2000/1/1.0
It is also possible to add days from the right:
a = Epoch(2004, 2, 27.8) b = 2.2 + a y, m, d = b.get_date() s = str(y) + "/" + str(m) + "/" + str(round(d, 2)) print_me("2.2 days plus 2004/2/27.8 is", s) # 2.2 days plus 2004/2/27.8 is: 2004/3/1.0
Comparison operadors between epochs are also defined:
a = Epoch(2007, 5, 20.0) b = Epoch(2007, 5, 20.000001) print_me("2007/5/20.0 == 2007/5/20.000001", a == b) # 2007/5/20.0 == 2007/5/20.000001: False print_me("2007/5/20.0 != 2007/5/20.000001", a != b) # 2007/5/20.0 != 2007/5/20.000001: True print_me("2007/5/20.0 > 2007/5/20.000001", a > b) # 2007/5/20.0 > 2007/5/20.000001: False print_me("2007/5/20.0 <= 2007/5/20.000001", a <= b) # 2007/5/20.0 <= 2007/5/20.000001: True
Compute the time of rise and setting of the Sun in a given day:
e = Epoch(2018, 5, 2) print("On May 2nd, 2018, Sun rising/setting times in Munich were (UTC):") latitude = Angle(48, 8, 0) longitude = Angle(11, 34, 0) altitude = 520.0 rising, setting = e.rise_set(latitude, longitude, altitude) y, m, d, h, mi, s = rising.get_full_date() print("Rising time: {}:{}".format(h, mi)) # Rising time: 3:50 y, m, d, h, mi, s = setting.get_full_date() print("Setting time: {}:{}".format(h, mi)) # Setting time: 18:33
Compute the hash of a given Epoch:
h = e.__hash__() print("Hash of Epoch({}): {}".format(e, h)) # Hash of Epoch(2458240.5): 1152921504609305216