Changelogs » Skyfield

PyUp Safety actively tracks 282,845 Python packages for vulnerabilities and notifies you when to upgrade.



  * Deprecated the old ``Topos`` class,
  which not only featured a clunky interface
  but hid from users the fact that Skyfield was generating IERS2010 positions
  from latitude and longitude
  when in fact nearly all users want WGS84 positions.
  Users are now encouraged to supply latitude and longitude
  to the :meth:`~skyfield.toposlib.Geoid.latlon()` method
  of either the :data:`~skyfield.toposlib.wgs84` object
  or the :data:`~skyfield.toposlib.iers2010` object.
  Related discussion:
  `372 <>`_
  * The two new geoid objects :data:`~skyfield.toposlib.wgs84`
  and :data:`~skyfield.toposlib.iers2010`
  have also provided a happy new home
  for the :meth:`~skyfield.toposlib.Geoid.subpoint()` method —
  which was previously stranded
  over on the :class:`~skyfield.positionlib.Geocentric` class,
  where it couldn’t be used with positions of other classes
  that might be centered at the geocenter.
  (The old method will remain in place to support legacy code,
  but is discouraged in new applications.)
  * The effects of :ref:`Polar motion` — if configured — are now included
  both when computing the position in space of an Earth latitude and longitude,
  and when determining the latitude and longitude beneath a celestial position.
  * Added :func:`~skyfield.api.load_constellation_names()`.
  * The :meth:`~skyfield.timelib.Time.utc_jpl()` method now correctly
  designates its return value as ``UTC`` instead of the ambiguious ``UT``.
  `515 <>`_


  * The position classes have gained methods
  :func:`~skyfield.positionlib.ICRF.frame_latlon()`, and
  that work with a new library ``skyfield.framelib``
  to offer a number of familiar reference frames.
  These replace the existing ad-hoc position methods
  for ecliptic and galactic coordinates,
  which are now deprecated (but will continue to be supported).
  See :ref:`reference_frames`.
  `476 <>`_
  * Added support for IERS :ref:`polar motion` 𝑥 and 𝑦.
  * Added a method :meth:`~skyfield.toposlib.GeographicPosition.lst_hours_at()`
  that computes Local Sidereal Time.
  * A new almanac routine :func:`~skyfield.almanac.moon_phase()` returns
  the Moon phase as an angle where 0° is New Moon, 90° is First Quarter,
  180° is Full, and 270° is Last Quarter.
  `282 <>`_
  * Almanac search routines that previously returned a Boolean true/false
  array now return an integer 0/1 array instead, to work around a new
  deprecation warning in NumPy which, for example, would have outlawed
  using the Boolean array from :func:`~skyfield.almanac.moon_nodes()` to
  index into the ``MOON_NODES`` list that provides a name for each node.
  `486 <>`_
  * The undocumented columns ``magnitude_H`` and ``magnitude_G`` in the
  Minor Planet Center comets dataframe have been renamed ``magnitude_g``
  and ``magnitude_k`` following further research on the file format
  (which does not itself document which magnitude model is intended).
  `416 <>`_


  * Fix: running ``load.timescale(builtin=False)`` was raising an
  exception ``FileNotFoundError`` if the ``finals2000A.all`` file was
  not already on disk, instead of downloading the file automatically.
  `477 <>`_


  * A new :func:`~skyfield.eclipselib.lunar_eclipses()` routine finds
  lunar eclipses and determines their degree of totality.
  `445 <>`_
  * The almanac module’s new :func:`~skyfield.almanac.meridian_transits()`
  routine can find the moments at which a body transits the meridian and
  `460 <>`_
  * Fix: the :func:`~skyfield.searchlib.find_minima()` function was
  ignoring its ``epsilon`` and ``num`` arguments and always using the
  default values instead.
  `475 <>`_
  * Fix: the ``.epoch`` attribute of Earth satellite objects that were
  built using :meth:`~skyfield.sgp4lib.EarthSatellite.from_satrec()`
  was, alas, a half-day off.
  `466 <>`_
  * Fix: the ``Topos`` constructor arguments ``x`` and ``y``,
  which never worked properly anyway,
  have been deprecated and are now ignored.


  * Skyfield now uses the International Earth Rotation Service (IERS) file
  ``finals2000A.all`` for updated ∆T and leap seconds.  The USNO is no
  longer updating the files ```` and ``deltat.preds`` that
  previous versions of Skyfield used, and the ```` server
  from which they were fetched will discontinue anonymous FTP on 2020
  October 31.  See `downloading-timescale-files`.
  `452 <>`_
  `464 <>`_
  * The comets dataframe built from the MPC file ``CometEls.txt`` now
  includes the ``reference`` column, so users can tell which orbit is
  most recent if there are several orbits for a single comet.  (For
  example, the file currently lists two C/2020 F3 (NEOWISE) orbits.)
  The comet examples in the documentation now build a dataframe that
  only includes the most recent orbit for each comet.
  `463 <>`_
  * Two new methods :meth:`~skyfield.iokit.Loader.days_old()` and
  :meth:`` make it simple to download a
  fresh copy of a file if the copy on disk is older than you would like.


  * The various ``strftime()`` Skyfield methods now support the ``%j``
  day-of-year format code.
  * Fix: the new Julian calendar support broke support for out-of-range
  month numbers, wrapping them into the current year instead of letting
  them overflow into subsequent years.
  `461 <>`_
  * Fix: a stray debugging ``print()`` statement was stranded in ``t.dut1``.
  `455 <>`_
  * The :class:`~skyfield.timelib.Time` object, if manually instantiated
  without a Julian date fraction, now provides a fraction array with
  dimensions that match the Julian date argument.
  `458 <>`_


  * Fix: the new Julian calendar feature was raising an exception in the
  calendar methods like :meth:`~skyfield.timelib.Time.tt_calendar()` if
  the time object was in fact an array of times.
  `450 <>`_
  * Fix: trying to iterate over a time object would raise an exception if
  the time was created through :meth:`~skyfield.timelib.Timescale.ut1()`.


  * **Broken URL:** Because the VizieR archive apparently decided to
  uncompress their copy of the ``hip_main.dat.gz`` Hipparcos catalog
  file, the old URL now returns a 404 error.  As an emergency fix, this
  version of Skyfield switches to their uncompressed ``hip_main.dat``.
  Hopefully they don’t compress it again and break the new URL!  A more
  permanent solution is discussed at:
  `454 <>`_
  * To unblock this release, removed a few deprecated pre-1.0 experiments
  from April 2015 in ``skyfield.hipparcos`` and ``skyfield.named_stars``
  that broke because the Hipparcos catalog is no longer compressed;
  hopefully no one was using them.
  * In a sweeping internal change, the :meth:`~skyfield.timelib.Timescale`
  and :meth:`~skyfield.timelib.Time` objects now offer support for the
  Julian calendar that’s used by historians for dates preceding the
  adoption of the Gregorian calendar in 1582.  See `choice of calendars`
  if you want to turn on Julian dates in your application.
  `450 <>`_


  * The printed appearance of both vectors and of vector functions like
  Earth locations and Earth satellites have been rewritten to be more
  informative and consistent.
  * Added :func:`~skyfield.timelib.compute_calendar_date()` which lets the
  caller choose the Julian calendar for ancient dates instead of always
  using the proleptic Gregorian calendar.  This should be particularly
  useful for historians.
  * Added :meth:`~skyfield.timelib.Timescale.J()` that builds a time array
  from an array of floating point years.
  `436 <>`_
  * Added four new ``strftime`` methods for the non-UTC timescales
  `(443). <>`_
  All four of them support ``%f`` for microseconds,
  and provide a reasonable default format string
  for callers who don’t wish to concoct their own:
  * :meth:`~skyfield.timelib.Time.tai_strftime()`
  * :meth:`~skyfield.timelib.Time.tt_strftime()`
  * :meth:`~skyfield.timelib.Time.tdb_strftime()`
  * :meth:`~skyfield.timelib.Time.ut1_strftime()`
  * Thanks to several fixes, comets and asteroids with parabolic and
  hyperbolic orbits should now raise fewer errors.
  * The prototype :func:`~skyfield.magnitudelib.planetary_magnitude()` can
  now return magnitudes for Uranus without raising an exception.  The
  routine does not yet take into account whether the observer is facing
  the equator or poles of Uranus, so the magnitude predicted for the
  planet will only be accurate to within about 0.1 magnitudes.


  * The official ∆T files on NASA’s FTP server have stopped receiving
  updates — they have no new data beyond February, the start of the
  global pandemic.  Unless they are updated by next February, older
  versions of Skyfield will unfortunately download the files all over
  again every time :meth:`~skyfield.iokit.Loader.timescale()` is called
  (unless the ``builtin=True`` parameter is provided).  To make Skyfield
  less fragile going forward:
  1. The loader’s :meth:`~skyfield.iokit.Loader.timescale()` method now
  defaults to ``builtin=True``, telling it to use the ∆T and leap
  second files that ship with Skyfield internally.  To download new
  ∆T files from NASA and the leap second file from the International
  Earth Rotation Service, specify ``builtin=False``.
  2. The concept of an “expired” file has been removed from ``load()``.
  Skyfield is now much simpler: if a file with the correct name
  exists, Skyfield uses it.  See :ref:`downloading-timescale-files`
  if you still want your application to check the age of your
  timescale files and automatically download new ones.
  * The `ICRF.separation_from()` method now officially supports the
  combination of an array of positions with a single reference position!
  Its previous support for that combination was, alas, accidental, and
  was broken with the 1.23 release.
  `414 <>`_
  `424 <>`_
  * A prototype :func:`~skyfield.magnitudelib.planetary_magnitude()`
  routine has been added with support for several planets.
  `210 <>`_
  * The ``utc`` timezone that Skyfield returns in Python datetimes is now
  either the Python Standard Library’s own UTC object, if it supplies
  one, or else is defined by Skyfield itself.  Skyfield no longer
  silently tries importing the whole ``pytz`` package merely to use its
  UTC object — which also means that the timezone returned by Skyfield
  longer offers the non-standard ``localize()`` method.
  `413 <>`_


  * Added :func:``
  and :func:``
  to load Stellarium star names and constellation lines.
  Constellation lines are featured in a new example script
  :ref:`neowise-chart` that produces a finder chart
  for comet C/2020 F3 NEOWISE.
  * The Hipparcos star catalog should now load faster, having switched
  behind the scenes to a higher performance Pandas import routine.
  * Fixed the ability of :meth:`~skyfield.timelib.Timescale.utc()` to
  accept a Python ```` object as its argument.
  `409 <>`_
  * Slightly lowered the precision of two tests when they detect that
  Python is compiled for a 32-bit processor, so the test suite can
  succeed when contributors package Skyfield for 32-bit Linux.
  `411 <>`_


  * Added methods :meth:`~skyfield.timelib.Timescale.from_datetime()` and
  :meth:`~skyfield.timelib.Timescale.from_datetimes()` to the
  :class:`~skyfield.timelib.Timescale` class, to better advertise the
  ability to build a Skyfield time from a Python ``datetime`` — an ability
  that was previously overloaded into the ``year`` parameter of the
  :meth:`~skyfield.timelib.Timescale.utc()` method (where it is still
  supported for backwards compatibility, but no longer documented).
  * Fix: improved the accuracy with which velocity is converted between
  the Earth-fixed ITRF frame that rotates with the Earth and the
  inertial GCRS frame that does not.  In particular, this should make
  Earth satellite velocities more accurate.


  * Added :doc:`kepler-orbits` support
  for generating the positions of comets and asteroids
  from Minor Planet Center data files.
  * Added :func:`~skyfield.positionlib.ICRF.is_behind_earth()` to
  determine whether a celestial object is blocked from an Earth
  satellite’s view by the Earth itself.
  * Replaced the awkward and hard-to-explain ``rough_period`` search
  parameter with the conceptually simpler ``step_days`` parameter, and
  updated the instructions in :doc:`searches` to match.
  * Made the :meth:`~skyfield.iokit.Loader.tle_file()` import method less
  strict about Earth satellite names: any text on the line before two
  lines of TLE data is now saved as the satellite name.  A parameter
  ``skip_names=True`` turns this off if, for particular TLE files, this
  leads to unwanted text being saved.


  * Skyfield’s improved time precision (stored internally as two floats)
  is now used in computing ephemeris positions, Earth orientation, and
  light-travel time, producing position angles which change much more
  smoothly over time on a sub-milliarcsecond scale.
  * :doc:`searches` is now documented for custom events that users define
  themselves, instead of only being documented for the official
  pre-written :doc:`almanac` functions.  Not only discrete events but
  also maxima and minima are now officially supported and documented,
  thanks to a rewrite of the underlying code.
  * Time objects no longer cache the nutation and precession matrices,
  since they are never used again after being multiplied together to
  create the equinox-of-date rotation matrix.  This should save 144
  bytes for each time in a :class:`~skyfield.timelib.Time` array.
  * It is now possible to :ref:`from-satrec` thanks to a new Earth
  satellite constructor method.
  `384 <>`_
  * Added :meth:`~skyfield.iokit.Loader.build_url()` that returns the URL
  from which Skyfield will download a file.
  `382 <>`_
  * Added :meth:`~skyfield.jpllib.SpiceKernel.close()` to support
  applications that need to do fine-grained resource management or whose
  testing framework check for dangling open files.
  `374 <>`_
  * Skyfield’s dependency list now asks for “jplephem” version 2.13 or
  later.  Skyfield 1.21, alas, could incur a ``Module not found`` error
  when importing ``jplephem.exceptions`` if a user had an old “jplephem”
  version already installed.
  `386 <>`_


  * Added :func:`~skyfield.positionlib.ICRF.is_sunlit()` to determine
  whether Earth satellites in orbit are in Earth’s shadow or not, thanks
  to a pull request from Jesse Coffey.
  * Added :func:`~skyfield.positionlib.position_of_radec()`
  to replace the poorly designed ``position_from_radec()``.
  * Skyfield :class:`~skyfield.timelib.Time` objects now have microsecond
  internal accuracy, so round trips to and from Python datetimes should
  now preserve all the microsecond digits.
  * The :meth:`~skyfield.timelib.Time.utc_strftime()` method now rounds to
  the nearest minute or second if it sees that either minutes or seconds
  are the smallest unit of time in the format string.
  * The 6 numbers in the sequence ``t.utc`` can now be accessed by the
  attribute names ``year``, ``month``, ``day``, ``hour``, ``minute``,
  and ``second``.
  * Nutation routines should now be faster and have a smaller memory
  footprint, thanks to a rewrite that uses more optimized NumPy calls.
  `373 <>`_
  * Thanks to Jérôme Deuchnord, the exception raised when asking for a
  position out-of-range of a JPL ephemeris now shows the calendar dates
  for which the ephemeris is valid and carries several useful attributes.
  `356 <>`_


  * Erik Tollerud contributed a fix for a deprecation warning about SSL
  from the most recent versions of Python (“cafile, cpath and cadefault
  are deprecated, use a custom context instead”).  The file download
  routine now auto-detects which mechanism your Python supports.
  `363 <>`_
  * Added an ``elevation_m`` argument to


  * To hopefully fix the ``SSL: CERTIFICATE_VERIFY_FAILED`` errors that
  some users encounter when downloading timescale files, Skyfield has
  taken the risk of switching away from your system’s SSL certificates
  to the certificate bundle from the ``certifi`` package.
  `317 <>`_
  * Added a new almanac routine for finding :ref:`lunar-nodes`.
  `361 <>`_
  * Gave geographic location objects a new ``itrf_xyz()``
  method that returns their raw ITRF coordinates.
  `354 <>`_
  * Fixed the sign of the velocity vector when two vectors are directly
  geometrically subtracted.
  `355 <>`_


  * Deprecated the old hybrid-key satellite dictionary returned by
  ``load.tle()`` in favor of a simple list returned by the new
  :meth:`~skyfield.iokit.Loader.tle_file()` routine.
  `345 <>`_
  * The almanac :func:`~skyfield.searchlib.find_discrete()` routine no
  longer returns extraneous values in its second return value if no
  changes of state were found.
  `339 <>`_
  `351 <>`_
  * Added documentation and support for computing lunar libration.
  `80 <>`_


  * Upgraded to a new version of the ``sgp4`` Python library that, when
  possible, uses the fast official C++ implementation of SGP4.
  * Added a :meth:`~skyfield.sgp4lib.EarthSatellite.find_events()` Earth
  satellite method that finds the times at which a satellite rises,
  culminates, and sets.
  * Improved the logic behind the :doc:`almanac` routines to avoid rare
  situations in which a cluster of nearly identical times would be
  produced for what should really be considered a single event.
  `333 <>`_
  * Fixed the :meth:`~skyfield.timelib.Time.utc_strftime()` method so it
  does not report that every day in all of recorded history is a Monday.
  `335 <>`_


  * Added basic :doc:`planetary` support, enough to compute the position
  of a given latitude and longitude on the surface of the Moon.
  `79 <>`_
  `124 <>`_
  `258 <>`_
  * Added :func:`~skyfield.almanac.oppositions_conjunctions()` for finding
  the dates when a planet is at opposition and conjunction with the sun.
  * Added :func:`~skyfield.trigonometry.position_angle_of()` for computing
  astronomical position angles.


  * Changed the URL for the Hipparcos catalog, because the VizieR archives
  FTP server is no longer responding.
  `301 <>`_
  * Added a :func:`~skyfield.almanac.dark_twilight_day()` function that
  not only handles sunrise and sunset but also all three kinds of
  `225 <>`_


  * Changed the URL from which leap second files are downloaded; the
  server that previously provided them is no longer responding.
  Thanks to Richard Shaw for the pull request.
  `296 <>`_
  `297 <>`_
  * Added a :func:`~skyfield.almanac.risings_and_settings()` function for
  computing rising and setting times.
  `271 <>`_


  * Provided a constellation lookup routine through
  * Added a ``position_from_radec()`` function.
  * Fixed the ``apparent()`` method in the case where a single observer
  position is observing an entire vector of target positions.
  `229 <>`_


  * Fix: an exception was being thrown when creating a ``Loader`` pointed
  at a Windows directory for which Python’s ``os.makedirs()`` function
  returned a spurious error.
  `283 <>`_
  * The internal ``reverse_terra()`` routine can now be given an
  ``iterations=0`` argument if the caller wants geocentric latitude and


  * You can now call ``load.timescale(builtin=True)`` to use time scale
  files that Skyfield carries internally, instead of downloading them.
  Note that the time scale files distributed with any given version of
  Skyfield will gradually fall out of date.
  * Fix: indexing a position now returns a position with an actual velocity.
  `241 <>`_
  * Fix: the ``Star`` method ``from_dataframe()`` now correctly pulls
  stellar parallax data from the dataframe if available.
  `266 <>`_
  * Fix: :func:`~skyfield.searchlib.find_discrete()` was generating empty
  arrays of search dates, upsetting the astronomy code, if the start and
  end dates were very close together.
  `240 <>`_


  * Fix: teach Skyfield the new format of the Naval Observatory ∆T data
  file ``deltat.preds``, whose change in format caused Skyfield to start
  throwing an exception for new users.
  `236 <>`_


  * Added :func:`~skyfield.almanac.seasons` to the :doc:`almanac` module
  that can be used to predict solstices and equinoxes.
  * Fix: the ecliptic coordinate routines no longer raise ``ValueError:
  too many values to unpack`` if they are passed a time array.
  `207 <>`_
  `208 <>`_


  * There is now an :doc:`almanac` module that can compute the times of
  sunrise, sunset, and the phases of the moon, based on the search
  algorithms announced at my recent PyBay talk “An Import Loop and a
  Fiery Reentry.”
  * Two new methods :meth:`~skyfield.positionlib.ICRF.cirs_xyz()` and
  :meth:`~skyfield.positionlib.ICRF.cirs_radec()` have been contributed
  which provide support for rotating a position into the Celestial
  Intermediate Reference System (CIRS).
  `192 <>`_


  * Skyfield now supports loading the Hipparcos star catalog as a Pandas
  dataframe, providing the user with convenient mechanisms for looking
  up a single star by HIP number or filtering the entire catalog by
  magnitude.  See :doc:`stars` for details.
  * Ecliptic coordinates can now be produced for epochs other than J2000
  thanks to a new optional parameter specifying the desired epoch for
  the ``ecliptic_latlon()`` method.
  * A position that gives a position, velocity, and time can now be
  converted into full osculating orbital elements through the routine
  * A couple of bugs in the ``load()`` routine have been fixed.
  `193 <>`_
  `194 <>`_


  * Both of the loader methods :meth:`` and
  ``tle()`` now accept not just URLs but also plain local file paths;
  they correctly re-download a remote file if “reload=True” is
  specified; and they allow specifying a different local “filename=”
  than the one at the end of the URL.
  * Earth satellite objects no longer try to instantiate a timescale object
  of their own, which often kicked off an unexpected download of the three
  files needed to build a timescale.
  * Satellite names are now correctly loaded from Space-Track TLE files.
  * The ability to create times using Julian Dates is now better advertised,
  thanks to dedicated timescale methods whose names end in ``…_jd()``.


  * The :meth:`~skyfield.positionlib.Geocentric.subpoint()` method
  now normalizes the longitude values it returns
  into the range −180° to 180°
  `182 <>`_
  and returns an actual elevation instead of zero.
  `185 <>`_
  * Earth satellites now return a real velocity vector instead of zero.
  `187 <>`_
  * Earth satellites now offer an
  method that returns raw ITRF coordinates for users interested in them.
  `85 <>`_


  * You can now specify the distance to an object when generating a
  position from altitude and azimuth coordinates.
  `158 <>`_
  * The dictionary of satellites returned when you read a TLE file
  now supports lookup by integer satellite ID, not just by name,
  and now knows how to parse TLE files from Space-Track.
  `163 <>`_
  `167 <>`_
  * Star coordinates can now be offered for any epoch, not just J2000.
  `166 <>`_
  * You can now create a time object given the UT1 date.
  `91 <>`_
  * Fractional Julian years are now available on ``Time`` objects as ``.J``.
  * The parameter DUT1 is now available on ``Time`` objects as ``.dut1``.
  `176 <>`_


  * Geocentric coordinates now have a
  method that computes the latitude and longitude
  of the point beneath that body.
  * All of the ``Timescale`` time constructor methods now accept arrays.
  * Emergency fix to stop Skyfield
  from endlessly downloading new copies of ``deltat.preds``,
  since the file has gone out of date at the USNO site.
  * Fixed ability of a :class:`~skyfield.starlib.Star`
  to be initialized with a tuple that breaks units into minutes and seconds
  (broke in version 1.2).
  * Issues fixed:
  `170 <>`_
  `172 <>`_


  * The documentation now describes
  how to create an excerpt of a large JPL ephemeris
  without downloading the entire file.
  Several Skyfield tests now run much faster
  because they use an ephemeris excerpt instead of waiting for a download.
  * For ``load_file()`` a leading ``~`` now means “your home directory”.
  * You can now initialize a velocity from kilometers per second
  with ``Velocity(km_per_s=...)``.
  * Empty time and angle objects no longer raise an exception when printed.
  (Thanks, JoshPaterson!)
  * Issues fixed:
  `160 <>`_
  `161 <>`_
  `162 <>`_


  * Positions can now be converted to AstroPy with
  * You can now provide a timescale of your own to an
  instead of having it trying to load one itself.
  * Downloaded files are no longer marked as executable on Windows.
  * A friendly error message, rather than an obscure traceback, is now
  returned if you try converting a position to alt/az coordinates but
  the position was not measured from a position on the Earth’s surface.


  * Brought the core API to maturity: replaced the narrow concept of
  building a “body” from several ephemeris segments with the general
  concept of a vector function that is the sum of several simpler vector
  * Added support for adding and subtracting vector functions.
  * Deprecated the Earth ``topos()`` method in favor of vector addition.
  * Deprecated the Earth ``satellite()`` method in favor of vector addition.
  * Deprecated the body ``geometry_of()`` method in favor of vector subtraction.
  * Celestrak satellite files can now be opened with ``load.tle(url_or_filename)``.


  * Attempted to speed up Earth satellite calculations by caching a single
  time scale object instead of creating a new one each time.
  * Fixed a possible divide-by-zero error when applying deflection to an
  apparent position.


  * The ``observe()`` method of an observer on the Earth’s surface now
  correctly accounts for the way that the Earth’s gravity will deflect
  the apparent position of objects that are not exactly overhead,
  bringing Skyfield’s agreement with the Naval Observatory’s NOVAS
  library to within half a milliarcsecond.
  * The time method ``tt_calendar()`` method no longer raises a
  ``TypeError`` when its value is an array.
  * Running ``repr()`` on a ``Time`` array now produces a more compact
  string that only mentions the start and end of the time period.
  * The ``api.load()`` call no longer attempts to animate a progress bar
  if the user is running it under IDLE, which would try to accumulate
  the updates as a single long line that eventually hangs the window.


  * Added an `api` document to the project, in reverent imitation of the
  `Pandas API Reference`_ that I keep open in a browser tab every time I
  am using the Pandas library.
  * New method `ICRF.separation_from()` computes the angular separation
  between two positions.
  * Fixed ``==`` between `Time` objects and other unrelated objects so
  that it no longer raises an exception.


  * Introduced the ``Timescale`` object with methods ``utc()``, ``tai()``,
  ``tt()``, and ``tdb()`` for building time objects, along with a
  ``load.timescale()`` method for building a new ``Timescale``.  The
  load method downloads ∆T and leap second data from official data
  sources and makes sure the files are kept up to date.  This replaces
  all former techniques for building and specifying dates and times.
  * Renamed ``JulianDate`` to ``Time`` and switched from ``jd`` to ``t``
  as the typical variable used for time in the documentation.
  * Deprecated timescale keyword arguments like ``utc=(…)`` for both the
  ``Time`` constructor and also for all methods that take time as
  an argument, including ```` and ````.
  * Users who want to specify a target directory when downloading a file
  will now create their own loader object, instead of having to specify
  a special keyword argument for every download::
  load = api.Loader('~/ephemeris-files')


  * Users can now supply a target ``directory`` when downloading a file::
  load('de421.bsp', directory='~/ephemerides')
  * Fix: removed inadvertent dependency on the Pandas library.
  * Fix: ``load()`` was raising a ``PermissionError`` on Windows after a
  successful download when it tried to rename the new file.


  * Skyfield now generates its own estimate for ``delta_t`` if the user
  does not supply their own ``delta_t=`` keyword when specifying a date.
  This should make altitude and azimuth angles much more precise.
  * The leap-second table has been updated to include 2015 July 1.
  * Both ecliptic and galactic coordinates are now supported.


  * Skyfield has dropped the 16-megabyte JPL ephemeris DE421 as an install
  dependency, since users might choose another ephemeris, or might not
  need one at all.  You now ask for a SPICE ephemeris to be downloaded
  at runtime with a call like ``planets = load('de421.bsp')``.
  * Planets are no longer offered as magic attributes, but are looked up
  through the square bracket operator.  So instead of typing
  ``planets.mars`` you should now type ``planets['mars']``.  You can run
  ``print(planets)`` to learn which bodies an ephemeris supports.
  * | Ask for planet positions with ```` instead of ``body(t)``.
  * Per IAU 2012 Resolution B2, Skyfield now uses lowercase *au* for the
  astronomical unit, and defines it as exactly 149 597 870 700 meters.
  While this API change is awkward for existing users, I wanted to make
  the change while Skyfield is still pre-1.0.  If this breaks a program
  that you already have running, please remember that a quick ``pip``
  ``install`` ``skyfield==0.4`` will get you up and running again until
  you have time to edit your code and turn ``AU`` into ``au``.


  * To prevent confusion, the :meth:`~skyfield.timelib.Time.astimezone()`
  and :meth:`~skyfield.timelib.Time.utc_datetime()` methods
  have been changed to return only a ``datetime`` object.
  If you also need a leap second flag returned,
  call the new methods
  and :meth:`~skyfield.timelib.Time.utc_datetime_and_leap_second()`.


  * The floating-point values of an angle
  ``a.radians``, ``a.degrees``, and ``a.hours``
  are now attributes instead of method calls.
  .. _Pandas API Reference: