Library of astronomical algorithms in Python.
PyMeeus is a Python implementation of the astronomical algorithms described in the classical book 'Astronomical Algorithms, 2nd Edition, Willmann-Bell Inc. (1998)' by Jean Meeus.
There are great astronomical libraries out there. For instance, if you're looking for high precision and speed you should take a look at libnova. For a set of python modules aimed at professional astronomers, you should look at Astropy. On the other hand, the advantages of PyMeeus are its simplicity, ease of use, ease of reading, ease of installation (it has the minimum amount of dependencies) and abundant documentation.
The easiest way of installing PyMeeus is using pip:
pip install pymeeus
Or, for a per-user installation:
pip install --user pymeeus
If you prefer Python3, you can use:
pip3 install --user pymeeus
If you have PyMeeus already installed, but want to upgrade to the latest version:
pip3 install -U pymeeus
It is very common to try to run PyMeeus like this:
import pymeeus
mydate = pymeeus.Epoch(1992, 10, 13.0)
But if you do that, you'll get an error like this:
Traceback (most recent call last):
File "/home/user/test/test.py", line 3, in <module>
epoch = pymeeus.Epoch(1992, 10, 13.0)
AttributeError: module 'pymeeus' has no attribute 'Epoch'
This issue points to a misunderstanding that is very common in the Python world. The keyword import
is used to import MODULES... but PyMeeus is NOT a module: It is a LIBRARY composed of MULTIPLE modules (Angle
, Epoch
, Coordinates
, etc). As of today, the library Pymeeus has 19 different modules (if you look into the directory where pip
stores the library, you'll find one ".py" file per module).
Therefore if you want to use, for example, the module Angle
you should use:
import pymeeus.Angle
I.e., your module is pymeeus.Angle
, and not just Angle
.
But there is more! When you use import
to fetch a module, you must then use the dot notation to access the components of the module (classes, functions, etc). For instance:
import pymeeus.Angle
i = pymeeus.Angle.Angle(11.94524)
In this case, you are telling the Python interpreter that you want to use the class Angle
(with parameter '11.94524') from the module Angle
belonging to the library pymeeus
.
There is, however, a more practical (and common) way to handle modules using the statement from <MODULE> import <COMPONENT>
. For instance:
from pymeeus.Angle import Angle
from pymeeus.Epoch import Epoch, JDE2000
from math import sin, cos, tan, acos, atan2, sqrt, radians, log10
This way is preferred because, among other reasons, only the required components are loaded into memory instead of the whole module. Also, now the component is directly added to your execution environment, which means that you no longer need to use the dot notation.
Therefore, the script at the beginning would become:
from pymeeus.Epoch import Epoch
mydate = Epoch(1992, 10, 13.0)
Author: Dagoberto Salazar
Distributed under the GNU Lesser General Public License v3 (LGPLv3). See
LICENSE.txt
and COPYING.LESSER
for more information.
Documentation: https://pymeeus.readthedocs.io/en/latest/
GitHub: https://github.com/architest/pymeeus
If you have Sphinx installed, you can generate your own, latest documentation going to directory 'docs' and issuing:
make html
Then the HTML documentation pages can be found in 'build/html'.
The preferred method to contribute is through forking and pull requests:
- Fork it (https://github.com/architest/pymeeus/fork)
- Create your feature branch (
git checkout -b feature/fooBar
) - Commit your changes (
git commit -am 'Add some fooBar'
) - Push to the branch (
git push origin feature/fooBar
) - Create a new Pull Request
Please bear in mind that PyMeeus follows the PEP8 style guide for Python code (PEP8). We suggest you install and use a linter like Flake8 before contributing.
Additionally, PyMeeus makes heavy use of automatic tests. As a general rule,
every function or method added must have a corresponding test in the proper
place in tests
directory.
Finally, documentation is also a big thing here. Add proper and abundant documentation to your new code. This also includes in-line comments!!!.
- Neil Freeman - Fixed undefined variable in Epoch.tt2ut
- molsen234 - Fixed bug when using fractional seconds, minutes, hours or days
- Sebastian Veigl - Added functionality for Jupiter's moons
- Sophie Scholz - Added functionality for Jupiter's moons
- Vittorio Serra - Added functionality for Jupiter's moons
- Michael Lutz - Added functionality for Jupiter's moons
- Ben Dilday - Added
__hash__()
method to class Epoch - Zivoslav - Bug report of winter solstice
- Devid, Hugo van Kemenade - Test suggestions
- 0.5.12
- Fixed a bug in the computation of the winter solstice. Added new tests and information about proper use of the library.
- 0.5.11
- Added parameter
local
to theEpoch
class constructor and the methodsget_date()
andget_full_date()
.
- Added parameter
- 0.5.10
- Added methods
moon_librations()
andmoon_position_angle_axis()
.
- Added methods
- 0.5.9
- Added method
moon_maximum_declination()
.
- Added method
- 0.5.8
- Fixed several bugs in
Epoch
class, and added methoddoy()
.
- Fixed several bugs in
- 0.5.7
- Added method
moon_passage_nodes()
.
- Added method
- 0.5.6
- Added method
moon_perigee_apogee()
.
- Added method
- 0.5.5
- Added method
moon_phase()
.
- Added method
- 0.5.4
- Added methods
illuminated_fraction_disk()
andposition_bright_limb()
toMoon
class.
- Added methods
- 0.5.3
- Fixed error in the return type of method
Sun.equation_of_time()
.
- Fixed error in the return type of method
- 0.5.2
- Added methods to compute the Moon's longitude of ascending node and perigee.
- 0.5.1
- Changes in the organization of the documentation.
- 0.5.0
- Added
Moon
class andposition()
methods.
- Added
- 0.4.3
- Added method
ring_parameters()
to Saturn class.
- Added method
- 0.4.2
- Added method
__hash__()
to Epoch. Now Epoch objects can be used as keys in a dictionary.
- Added method
- 0.4.1
- Added funtionality to compute the positions of Jupiter's Galilean moons.
- 0.4.0
- Added methods to compute Saturn's ring inclination and longitude of ascending node.
- 0.3.13
- Additional encoding changes.
- 0.3.12
- Deleted
encoding
keyword from setup.py, which was giving problems.
- Deleted
- 0.3.11
- Added encoding specification to setup.py.
- 0.3.10
- Fixed characters with the wrong encoding.
- 0.3.9
- Relaxed requirements, added contributor molsen234, and fixed format problems showed by flake8.
- 0.3.8
- Fixed undefined variable in
Epoch.tt2ut
.
- Fixed undefined variable in
- 0.3.7
- Fix bug when using fractional seconds, minutes, hours or days, plus documentation improvements.
- 0.3.6
- Add method to compute rising and setting times of the Sun.
- 0.3.5
- Add method
magnitude()
to planet classes.
- Add method
- 0.3.4
- Add method to compute the parallax correction to Earth class.
- 0.3.3
- Add methods to compute the passage through the nodes.
- 0.3.2
- Add methods to compute the perihelion and aphelion of all planets.
- 0.3.1
- Fix errors in the elongation computation, add tests and examples of use of methods
geocentric_position()
, and tests and examples forPluto
class.
- Fix errors in the elongation computation, add tests and examples of use of methods
- 0.3.0
- Added
Pluto
class.
- Added