def test_iso_of_decimal_that_rounds_down(): jd = JulianDate(utc=(2014, 12, 21, 6, 3, 1.234234)) assert jd.utc_iso(places=0) == "2014-12-21T06:03:01Z" assert jd.utc_iso(places=1) == "2014-12-21T06:03:01.2Z" assert jd.utc_iso(places=2) == "2014-12-21T06:03:01.23Z" assert jd.utc_iso(places=3) == "2014-12-21T06:03:01.234Z" assert jd.utc_iso(places=4) == "2014-12-21T06:03:01.2342Z"
def test_iso_of_leap_second_with_fraction(): jd = JulianDate(utc=(1973, 12, 31, 23, 59, 60.12349)) assert jd.utc_iso(places=0) == "1973-12-31T23:59:60Z" assert jd.utc_iso(places=1) == "1973-12-31T23:59:60.1Z" assert jd.utc_iso(places=2) == "1973-12-31T23:59:60.12Z" assert jd.utc_iso(places=3) == "1973-12-31T23:59:60.123Z" assert jd.utc_iso(places=4) == "1973-12-31T23:59:60.1235Z"
def test_iso_of_leap_second_with_fraction(): jd = JulianDate(utc=(1973, 12, 31, 23, 59, 60.12349)) assert jd.utc_iso(places=0) == '1973-12-31T23:59:60Z' assert jd.utc_iso(places=1) == '1973-12-31T23:59:60.1Z' assert jd.utc_iso(places=2) == '1973-12-31T23:59:60.12Z' assert jd.utc_iso(places=3) == '1973-12-31T23:59:60.123Z' assert jd.utc_iso(places=4) == '1973-12-31T23:59:60.1235Z'
def test_iso_of_decimal_that_rounds_down(): jd = JulianDate(utc=(2014, 12, 21, 6, 3, 1.234234)) assert jd.utc_iso(places=0) == '2014-12-21T06:03:01Z' assert jd.utc_iso(places=1) == '2014-12-21T06:03:01.2Z' assert jd.utc_iso(places=2) == '2014-12-21T06:03:01.23Z' assert jd.utc_iso(places=3) == '2014-12-21T06:03:01.234Z' assert jd.utc_iso(places=4) == '2014-12-21T06:03:01.2342Z'
def test_iso_of_decimal_that_rounds_up(): jd = JulianDate(utc=(1915, 12, 2, 3, 4, 5.6786786)) assert jd.utc_iso(places=0) == '1915-12-02T03:04:06Z' assert jd.utc_iso(places=1) == '1915-12-02T03:04:05.7Z' assert jd.utc_iso(places=2) == '1915-12-02T03:04:05.68Z' assert jd.utc_iso(places=3) == '1915-12-02T03:04:05.679Z' assert jd.utc_iso(places=4) == '1915-12-02T03:04:05.6787Z'
def test_iso_of_decimal_that_rounds_up(): jd = JulianDate(utc=(1915, 12, 2, 3, 4, 5.6786786)) assert jd.utc_iso(places=0) == "1915-12-02T03:04:06Z" assert jd.utc_iso(places=1) == "1915-12-02T03:04:05.7Z" assert jd.utc_iso(places=2) == "1915-12-02T03:04:05.68Z" assert jd.utc_iso(places=3) == "1915-12-02T03:04:05.679Z" assert jd.utc_iso(places=4) == "1915-12-02T03:04:05.6787Z"
def test_stftime_of_date_array(): jd = JulianDate(utc=(1973, 12, 31, 23, 59, np.arange(59.0, 61.1, 1.0))) assert jd.utc_strftime('%Y %m %d %H %M %S') == [ '1973 12 31 23 59 59', '1973 12 31 23 59 60', '1974 01 01 00 00 00', ]
def test_jpl_format(): jd = JulianDate(utc=(range(-300, 301, 100), 7, 1)) assert jd.utc_jpl() == [ "B.C. 0301-Jul-01 00:00:00.0000 UT", "B.C. 0201-Jul-01 00:00:00.0000 UT", "B.C. 0101-Jul-01 00:00:00.0000 UT", "B.C. 0001-Jul-01 00:00:00.0000 UT", "A.D. 0100-Jul-01 00:00:00.0000 UT", "A.D. 0200-Jul-01 00:00:00.0000 UT", "A.D. 0300-Jul-01 00:00:00.0000 UT", ]
def test_jpl_format(): jd = JulianDate(utc=(range(-300, 301, 100), 7, 1)) assert jd.utc_jpl() == [ 'B.C. 0301-Jul-01 00:00:00.0000 UT', 'B.C. 0201-Jul-01 00:00:00.0000 UT', 'B.C. 0101-Jul-01 00:00:00.0000 UT', 'B.C. 0001-Jul-01 00:00:00.0000 UT', 'A.D. 0100-Jul-01 00:00:00.0000 UT', 'A.D. 0200-Jul-01 00:00:00.0000 UT', 'A.D. 0300-Jul-01 00:00:00.0000 UT', ]
def test_iso_of_array_showing_whole_seconds(): jd = JulianDate(utc=(1973, 12, 31, 23, 59, np.arange(58.75, 63.1, 0.5))) assert jd.utc_iso(places=0) == [ '1973-12-31T23:59:59Z', '1973-12-31T23:59:59Z', '1973-12-31T23:59:60Z', '1973-12-31T23:59:60Z', '1974-01-01T00:00:00Z', '1974-01-01T00:00:00Z', '1974-01-01T00:00:01Z', '1974-01-01T00:00:01Z', '1974-01-01T00:00:02Z', ]
def test_iso_of_array_showing_fractions(): jd = JulianDate(utc=(1973, 12, 31, 23, 59, np.arange(58.75, 63.1, 0.5))) assert jd.utc_iso(places=2) == [ '1973-12-31T23:59:58.75Z', '1973-12-31T23:59:59.25Z', '1973-12-31T23:59:59.75Z', '1973-12-31T23:59:60.25Z', '1973-12-31T23:59:60.75Z', '1974-01-01T00:00:00.25Z', '1974-01-01T00:00:00.75Z', '1974-01-01T00:00:01.25Z', '1974-01-01T00:00:01.75Z', ]
def test_iso_of_array_showing_whole_seconds(): jd = JulianDate(utc=(1973, 12, 31, 23, 59, np.arange(58.75, 63.1, 0.5))) assert jd.utc_iso(places=0) == [ "1973-12-31T23:59:59Z", "1973-12-31T23:59:59Z", "1973-12-31T23:59:60Z", "1973-12-31T23:59:60Z", "1974-01-01T00:00:00Z", "1974-01-01T00:00:00Z", "1974-01-01T00:00:01Z", "1974-01-01T00:00:01Z", "1974-01-01T00:00:02Z", ]
def Calculate(earth,planet,stri,lat,long): #boston = earth.topos('50.833639 N', '4.018829 E') boston = earth.topos(lat+' N', long+' E') startDate = datetime.datetime( 2015, 11, 1,22,00,00,0, pytz.UTC ) endDate = datetime.datetime( 2016, 4, 1,22,00,00,0, pytz.UTC ) dayDelta = datetime.timedelta( days=1 ) momentList = [] while startDate < endDate: startDate += dayDelta date = JulianDate(startDate) position = boston.at(date).observe(planet) momentList.append(Print(position,stri,date.utc_datetime())) return momentList
def test_iso_of_array_showing_fractions(): jd = JulianDate(utc=(1973, 12, 31, 23, 59, np.arange(58.75, 63.1, 0.5))) assert jd.utc_iso(places=2) == [ "1973-12-31T23:59:58.75Z", "1973-12-31T23:59:59.25Z", "1973-12-31T23:59:59.75Z", "1973-12-31T23:59:60.25Z", "1973-12-31T23:59:60.75Z", "1974-01-01T00:00:00.25Z", "1974-01-01T00:00:00.75Z", "1974-01-01T00:00:01.25Z", "1974-01-01T00:00:01.75Z", ]
def test_indexing_julian_date(): jd = JulianDate(utc=(1974, 10, range(1, 6))) assert jd.shape == (5, ) jd0 = jd[0] assert jd.tai[0] == jd0.tai assert jd.tt[0] == jd0.tt assert jd.tdb[0] == jd0.tdb assert jd.ut1[0] == jd0.ut1 assert jd.delta_t == jd0.delta_t
def test_slicing_julian_date(): jd = JulianDate(utc=(1974, 10, range(1, 6))) assert jd.shape == (5, ) jd24 = jd[2:4] assert jd24.shape == (2, ) assert (jd.tai[2:4] == jd24.tai).all() assert (jd.tt[2:4] == jd24.tt).all() assert (jd.tdb[2:4] == jd24.tdb).all() assert (jd.ut1[2:4] == jd24.ut1).all() assert jd.delta_t == jd24.delta_t
def test_appendix_c_satellite(): lines = appendix_c_example.splitlines() sat = EarthSatellite(lines, earth) jd_epoch = sat._sgp4_satellite.jdsatepoch three_days_later = jd_epoch + 3.0 jd = JulianDate(tt=three_days_later) jd.ut1 = array(three_days_later) # First, a crucial sanity check (which is, technically, a test of # the `sgp4` package and not of Skyfield): are the right coordinates # being produced by our Python SGP4 propagator for this satellite? rTEME, vTEME = sat._position_and_velocity_TEME_km(jd) assert abs(-9060.47373569 - rTEME[0]) < 1e-8 assert abs(4658.70952502 - rTEME[1]) < 1e-8 assert abs(813.68673153 - rTEME[2]) < 1e-8 assert abs(-2.232832783 - vTEME[0]) < 1e-9 assert abs(-4.110453490 - vTEME[1]) < 1e-9 assert abs(-3.157345433 - vTEME[2]) < 1e-9
def test_appendix_c_satellite(): lines = appendix_c_example.splitlines() sat = EarthSatellite(lines, earth) jd_epoch = sat._sgp4_satellite.jdsatepoch three_days_later = jd_epoch + 3.0 offset = JulianDate(tt=three_days_later)._utc_float() - three_days_later jd = JulianDate(tt=three_days_later - offset) # First, a crucial sanity check (which is, technically, a test of # the `sgp4` package and not of Skyfield): are the right coordinates # being produced by our Python SGP4 propagator for this satellite? rTEME, vTEME, error = sat._position_and_velocity_TEME_km(jd) assert abs(-9060.47373569 - rTEME[0]) < 1e-8 assert abs(4658.70952502 - rTEME[1]) < 1e-8 assert abs(813.68673153 - rTEME[2]) < 1e-8 assert abs(-2.232832783 - vTEME[0]) < 1e-9 assert abs(-4.110453490 - vTEME[1]) < 1e-9 assert abs(-3.157345433 - vTEME[2]) < 1e-9
def test_iss_altitude_computed_with_gcrs(iss_transit): dt, their_altitude = iss_transit cst = timedelta(hours=-6) #, minutes=1) dt = dt - cst jd = JulianDate(utc=dt, delta_t=67.2091) lines = iss_tle.splitlines() s = EarthSatellite(lines, earth) lake_zurich = earth.topos(latitude_degrees=42.2, longitude_degrees=-88.1) alt, az, d = lake_zurich.gcrs(jd).observe(s).altaz() print(dt, their_altitude, alt.degrees, their_altitude - alt.degrees) assert abs(alt.degrees - their_altitude) < 2.5 # TODO: tighten this up?
def test_building_JulianDate_from_list_of_utc_datetimes(): jd = JulianDate(utc=[ datetime(1973, 12, 29, 23, 59, 48, tzinfo=utc), datetime(1973, 12, 30, 23, 59, 48, tzinfo=utc), datetime(1973, 12, 31, 23, 59, 48, tzinfo=utc), datetime(1974, 1, 1, 23, 59, 47, tzinfo=utc), datetime(1974, 1, 2, 23, 59, 47, tzinfo=utc), datetime(1974, 1, 3, 23, 59, 47, tzinfo=utc), ]) assert (jd.tai == [ 2442046.5, 2442047.5, 2442048.5, 2442049.5, 2442050.5, 2442051.5, ]).all()
def test_appendix_c_conversion_from_TEME_to_ITRF(): rTEME = array([5094.18016210, 6127.64465950, 6380.34453270]) vTEME = array([-4.746131487, 0.785818041, 5.531931288]) vTEME = vTEME * 24.0 * 60.0 * 60.0 # km/s to km/day jd_ut1 = JulianDate(tt=(2004, 4, 6, 7, 51, 28.386 - 0.439961)).tt xp = -0.140682 * arcsecond yp = 0.333309 * arcsecond rITRF, vITRF = TEME_to_ITRF(jd_ut1, rTEME, vTEME, xp, yp) meter = 1e-3 assert abs(-1033.47938300 - rITRF[0]) < 0.1 * meter assert abs(+7901.29527540 - rITRF[1]) < 0.1 * meter assert abs(+6380.35659580 - rITRF[2]) < 0.1 * meter vITRF_per_second = vITRF * second assert abs(-3.225636520 - vITRF_per_second[0]) < 1e-4 * meter assert abs(-2.872451450 - vITRF_per_second[1]) < 1e-4 * meter assert abs(+5.531924446 - vITRF_per_second[2]) < 1e-4 * meter
def test_leap_second(ts): # During 1973 the offset between UTC and TAI was 12.0 seconds, so # TAI should reach the first moment of 1974 while the UTC clock is # still reading 12s before midnight (60 - 12 = 48). Happily, the # fraction 0.5 can be precisely represented in floating point, so we # can use a bare `==` in this assert: t0 = ts.utc((1973, 12, 31, 23, 59, 48.0)).tai assert t0 == 2442048.5 # Here are some more interesting values: t1 = ts.utc((1973, 12, 31, 23, 59, 58.0)).tai t2 = ts.utc((1973, 12, 31, 23, 59, 59.0)).tai t3 = ts.utc((1973, 12, 31, 23, 59, 60.0)).tai t4 = ts.utc((1974, 1, 1, 0, 0, 0.0)).tai t5 = ts.utc((1974, 1, 1, 0, 0, 1.0)).tai # The step from 23:59:59 to 0:00:00 is here a two-second step, # because of the leap second 23:59:60 that falls in between: assert abs(t4 - t2 - 2.0 * one_second) < epsilon # Thus, the five dates given above are all one second apart: assert abs(t2 - t1 - one_second) < epsilon assert abs(t3 - t2 - one_second) < epsilon assert abs(t4 - t3 - one_second) < epsilon assert abs(t5 - t4 - one_second) < epsilon # And all these dates can be converted back to UTC. assert JulianDate(tai=t0).utc_iso() == '1973-12-31T23:59:48Z' assert JulianDate(tai=t1).utc_iso() == '1973-12-31T23:59:58Z' assert JulianDate(tai=t2).utc_iso() == '1973-12-31T23:59:59Z' assert JulianDate(tai=t3).utc_iso() == '1973-12-31T23:59:60Z' assert JulianDate(tai=t4).utc_iso() == '1974-01-01T00:00:00Z' assert JulianDate(tai=t5).utc_iso() == '1974-01-01T00:00:01Z'
def test_astimezone(): jd = JulianDate(utc=(1969, 7, 20, 20, 18)) tz = timezone("US/Eastern") dt = jd.astimezone(tz) assert dt == tz.localize(datetime(1969, 7, 20, 16, 18, 0, 0))
def test_early_utc(): jd = JulianDate(utc=(1915, 12, 2, 3, 4, 5.6786786)) assert abs(jd.tt - 2420833.6283317441) < epsilon assert jd.utc_iso() == "1915-12-02T03:04:06Z"
def test_stftime_of_single_date(): jd = JulianDate(utc=(1973, 12, 31, 23, 59, 60)) assert jd.utc_strftime("%Y %m %d %H %M %S") == "1973 12 31 23 59 60"
def test_JulianDate_init(time_parameter, time_value): kw = {time_parameter: time_value} jd = JulianDate(**kw) assert getattr(jd, time_parameter) == 2441700.56640625
def test_stftime_of_single_date(): jd = JulianDate(utc=(1973, 12, 31, 23, 59, 60)) assert jd.utc_strftime('%Y %m %d %H %M %S') == '1973 12 31 23 59 60'
def test_building_JulianDate_from_utc_tuple_with_array_inside(): seconds = np.arange(48.0, 58.0, 1.0) jd = JulianDate(utc=(1973, 12, 29, 23, 59, seconds)) assert seconds.shape == jd.shape for i, second in enumerate(seconds): assert jd.tai[i] == JulianDate(utc=(1973, 12, 29, 23, 59, second)).tai
def test_building_JulianDate_from_single_utc_datetime(): jd = JulianDate(utc=datetime(1973, 12, 29, 23, 59, 48, tzinfo=utc)) assert jd.tai == 2442046.5
def test_utc_datetime_and_leap_second(): jd = JulianDate(utc=(1969, 7, 20, 20, 18)) dt, leap_second = jd.utc_datetime_and_leap_second() assert dt == datetime(1969, 7, 20, 20, 18, 0, 0, utc) assert leap_second == 0
def test_utc_datetime(): jd = JulianDate(utc=(1969, 7, 20, 20, 18)) dt = jd.utc_datetime() assert dt == datetime(1969, 7, 20, 20, 18, 0, 0, utc)
def test_astimezone_and_leap_second(): jd = JulianDate(utc=(1969, 7, 20, 20, 18)) tz = timezone("US/Eastern") dt, leap_second = jd.astimezone_and_leap_second(tz) assert dt == tz.localize(datetime(1969, 7, 20, 16, 18, 0, 0)) assert leap_second == 0
def test_early_utc(): jd = JulianDate(utc=(1915, 12, 2, 3, 4, 5.6786786)) assert abs(jd.tt - 2420833.6283317441) < epsilon assert jd.utc_iso() == '1915-12-02T03:04:06Z'
def test_building_JulianDate_from_naive_datetime_raises_exception(): with assert_raises(ValueError) as info: JulianDate(utc=datetime(1973, 12, 29, 23, 59, 48)) assert 'import timezone' in str(info.exception)
def test_astimezone(): jd = JulianDate(utc=(1969, 7, 20, 20, 18)) tz = timezone('US/Eastern') dt = jd.astimezone(tz) assert dt == tz.localize(datetime(1969, 7, 20, 16, 18, 0, 0))
def test_astimezone_and_leap_second(): jd = JulianDate(utc=(1969, 7, 20, 20, 18)) tz = timezone('US/Eastern') dt, leap_second = jd.astimezone_and_leap_second(tz) assert dt == tz.localize(datetime(1969, 7, 20, 16, 18, 0, 0)) assert leap_second == 0
def bm_coordinate_to_apparent(times, t): coordinate = star.observe_from(earth(t)) run_benchmark(times, coordinate.apparent) def bm_coordinate_horizontal(times, t): ggr = earth.topos('75 W', '45 N', elevation_m=0.0) run_benchmark(times, ggr(t).observe(jupiter).apparent().horizontal) BENCHMARKS = ( BM(times=100, bm_fn=bm_earth_rotation_angle, t=array([T0, TA, TB])), BM(times=100, bm_fn=bm_star_observe_from, t=JulianDate(tt=T0)), BM(times=100, bm_fn=bm_star_observe_from, t=JulianDate(tt=TA)), BM(times=100, bm_fn=bm_star_observe_from, t=JulianDate(tt=TB)), BM(times=100, bm_fn=bm_planet_observe_from, t=JulianDate(tt=T0)), BM(times=100, bm_fn=bm_planet_observe_from, t=JulianDate(tt=TA)), BM(times=100, bm_fn=bm_planet_observe_from, t=JulianDate(tt=TB)), BM(times=100, bm_fn=bm_topo_planet_observe, t=JulianDate(tt=T0)), BM(times=100, bm_fn=bm_topo_planet_observe, t=JulianDate(tt=TA)), BM(times=100, bm_fn=bm_topo_planet_observe, t=JulianDate(tt=TB)), BM(times=100, bm_fn=bm_earth_tilt, t=JulianDate(tt=T0)), BM(times=100, bm_fn=bm_earth_tilt, t=JulianDate(tt=TA)), BM(times=100, bm_fn=bm_earth_tilt, t=JulianDate(tt=TB)),