Module histastro.datetime

Date and time functions for HistAstro.

Expand source code
#  Copyright (c) 2019  Marc van der Sluys - marc.vandersluys.nl
#   
#  This file is part of the HistAstro Python package,
#  see: https://astro.ru.nl/~sluys/HistAstro/
#   
#  This is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#  
#  This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
#  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License along with this code.  If not, see 
#  <https://www.gnu.org/licenses/>.


"""Date and time functions for HistAstro."""


# Modules:
import math as m
import numpy as np
from histastro.constants import pi2, jd1820,jd2000


def julianDay(year,month,day):
    """Compute the Julian Day for a given year, month and day.
    
    Notes:
      - Date and time are expressed in UT.
      - Decimals can be used in the day to take into account the time of day other than midnight, e.g. 1.5 for
        noon on the first day of the month.
    
    Args:
      year (int):    Year CE (UT).  Note that year=0 = 1 BCE.
      month (int):   Month number of year (UT; 1-12).
      day (double):  Day of month with fraction (UT; 1.0-31.999).
    
    Returns:
      double:  jd: Julian day (days).

    """
    
    year0 = year
    if month <= 2:  # Jan and Feb are month 13 and 14 of the previous year
       year -= 1
       month += 12
       
    b = 0; a=0
    if year0 > 1582:     # Assume a Gregorian date
       a = m.floor(year/100.0)
       b = 2 - a + m.floor(a/4.0)
       
    jd = m.floor(365.25*(year+4716)) + m.floor(30.6001*(month+1)) + day + b - 1524.5
    
    return jd



def jd2cal(jd):
    """
    Compute the calendar date from a given Julian Day.
    
    Notes:
      - Date and time are expressed in UT.
      - Decimals can be returned in the day to indicate the time of day, e.g. 1.0 for midnight and 1.5 for
        noon on the first day of the month.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      tuple (int,int,double):  Tuple containing (year, month, day):
    
        - year (int):    Year CE (UT).  Note that year=0 indicates 1 BCE.
        - month (int):   Month number of year (UT; 1-12).
        - day (double):  Day of month with fraction (UT; 1.0-31.999).

    """
    
    z = m.floor(jd+0.5)
    f = jd + 0.5 - z
    if(z < 2299161):   # Use the Julian calendar
       a = z
    else:              # Use the Gregorian calendar
       alpha = m.floor((z-1867216.25)/36524.25)
       a = z + 1 + alpha - m.floor(alpha/4.)
    
    b = a + 1524
    c = m.floor((b - 122.1)/365.25)
    d = m.floor(365.25*c)
    e = m.floor((b-d)/30.6001)
    day = b - d - m.floor(30.6001*e) + f
    
    if(e < 14):
       month = int(e - 1)
    else:
       month = int(e - 13)
       
    if(month > 2):
       year = int(c - 4716)
    else:
       year = int(c - 4715)
       
    return year,month,day



def jd2year(jd):
    """
    Compute a year with fraction from a given Julian Day.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  Year CE, with decimals.  Note that year=0 indicates 1 BCE.
    
    """
    
    year,month,day = jd2cal(jd)     # Compute current year
    jd0 = julianDay(year,   1, 1)   # Jan 1 of current year
    jd1 = julianDay(year+1, 1, 1)   # Jan 1 of next year
    dy  = (jd-jd0) / (jd1-jd0)      # Linear interpolation for fractional year
    
    return year + dy
    


def jd2tjc(jd):
    """
    Compute the time in Julian centuries since 2000.0.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  tjc: Time in Julian centuries since 2000.0 (UT).
    
    """
    
    return (jd - 2451545.0)/36525


def jd2tjm(jd):
    """
    Compute the time in Julian millennia since 2000.0.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  tjm: Time in Julian millennia since 2000.0 (UT).
    
    """
    
    return (jd - 2451545.0)/365250


def gmst(jd):
    """
    Calculate Greenwich Mean Sidereal Time for any instant, in radians.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  gmst: Greenwich mean sidereal time (rad).
    
    References:
      - Explanatory Supplement to the Astronomical Almanac, 3rd ed, Eq. 6.66 (2012).
    
    """
    
    tjd  = jd - jd2000                      # Julian Days after 2000.0 UT
    tjd2 = tjd**2
    tjd4 = tjd2**2
           
    gmst = 4.89496121088131 + 6.30038809894828323*tjd + 5.05711849e-15*tjd2 - 4.378e-28*tjd2*tjd - 8.1601415e-29*tjd4 \
        - 2.7445e-36*tjd4*tjd  # Eq. 6.66, removed Delta-T term, hence replaced the first term
    
    return gmst % pi2


def DeltaT1820(jd):
    """
    Return a rough estimate for the value of Delta T.
    
    A lenghtening of the day of 1.8 ms/century is assumed, as well as and that the minimum of the parabola is
    DeltaT=12s in 1820.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  Delta T (s).
    
    References:
      - [Extrapolation of Delta T](https://hemel.waarnemen.com/Computing/deltat.html).
    
    """
    
    # return 12 + 0.5 * 1.8e-3/86400/(36525*86400) * ((jd-jd1820)*86400)**2
    return 12 + 0.5 * 1.8e-3 / 36525 * (jd-jd1820)**2  # simplified



def DeltaT(jd):
    """Return the value of DeltaT through interpolation.
    
    For the date range -700 - now, the value for Delta T is obtained by interpolation of known historical
      values.  Outside this range, a lenghtening of the day of 1.8 ms/century is assumed, as well as that the
      minimum of the parabola is DeltaT=12s in 1820.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  Delta T (s).
    
    References:
      - [International Earth Rotation and Reference Systems Service](ftp://maia.usno.navy.mil/ser7/deltat.data) of the U.S. Naval Observatory.
      - [Robert van Gent's website on Delta T](https://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm).
      - [Extrapolation of Delta T](https://hemel.waarnemen.com/Computing/deltat.html).
    
    """
    
    # Known data:
    years = [-700,-600,-500,-400,-300,-200,-100,0,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021]
    DTvalues = [20400,18800,17190,15530,14080,12790,11640,10580,9600,8640,7680,6700,5710,4740,3810,2960,2200,1570,1090,740,490,320,200,120,124,119,115,110,106,102,98,95,91,88,85,82,79,77,74,72,70,67,65,63,62,60,58,57,55,54,53,51,50,49,48,47,46,45,44,43,42,41,40,38,37,36,35,34,33,32,31,30,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,14,13,12,12,11,11,10,10,10,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,14,14,14,14,14,14,14,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,16,16,16,16,15,15,14,14,13.7,13.4,13.1,12.9,12.7,12.6,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.4,12.3,12.2,12.0,11.7,11.4,11.1,10.6,10.2,9.6,9.1,8.6,8.0,7.5,7.0,6.6,6.3,6.0,5.8,5.7,5.6,5.6,5.6,5.7,5.8,5.9,6.1,6.2,6.3,6.5,6.6,6.8,6.9,7.1,7.2,7.3,7.4,7.5,7.6,7.7,7.7,7.8,7.8,7.88,7.82,7.54,6.97,6.40,6.02,5.41,4.10,2.92,1.82,1.61,0.10,-1.02,-1.28,-2.69,-3.24,-3.64,-4.54,-4.71,-5.11,-5.40,-5.42,-5.20,-5.46,-5.46,-5.79,-5.63,-5.64,-5.80,-5.66,-5.87,-6.01,-6.19,-6.64,-6.44,-6.47,-6.09,-5.76,-4.66,-3.74,-2.72,-1.54,-0.02,1.24,2.64,3.86,5.37,6.14,7.75,9.13,10.46,11.53,13.36,14.65,16.01,17.20,18.24,19.06,20.25,20.95,21.16,22.25,22.41,23.03,23.49,23.62,23.68,24.49,24.34,24.08,24.02,24.00,23.87,23.95,23.86,23.93,23.73,23.92,23.96,24.02,24.33,24.83,25.30,25.70,26.24,26.77,27.28,27.78,28.25,28.71,29.15,29.57,29.97,30.36,30.72,31.07,31.35,31.68,32.18,32.68,33.15,33.59,34.00,34.47,35.03,35.73,36.54,37.43,38.29,39.20,40.18,41.17,42.23,43.37,44.4841,45.4761,46.4567,47.5214,48.5344,49.5861,50.5387,51.3808,52.1668,52.9565,53.7882,54.3427,54.8712,55.3222,55.8197,56.3000,56.8553,57.5653,58.3092,59.1218,59.9845,60.7853,61.6287,62.2950,62.9659,63.4673,63.8285,64.0908,64.2998,64.4734,64.5736,64.6876,64.8452,65.1464,65.4574,65.7768,66.0699,66.3246,66.6030,66.9069,67.2810,67.6439,68.1024,68.5927,68.9677,69.2202,69.87,70.4]
    
    year = jd2year(jd)  # Year with fraction for jd of interest
    
    if(year < years[0]):     # Before -700
        jd0 = julianDay(years[0], 1, 1)
        return DeltaT1820(jd) - DeltaT1820(jd0) + DTvalues[0]
    
    elif(year > years[-1]):  # in the future
        jd1 = julianDay(years[-1], 1, 1)
        return DeltaT1820(jd) - DeltaT1820(jd1) + DTvalues[-1]
    
    else:                    # linear interpolation from known data
        return np.interp(year, years, DTvalues)

Functions



def histastro.datetime.DeltaT (jd)

Return the value of DeltaT through interpolation.

For the date range -700 - now, the value for Delta T is obtained by interpolation of known historical values. Outside this range, a lenghtening of the day of 1.8 ms/century is assumed, as well as that the minimum of the parabola is DeltaT=12s in 1820.

Args

jd : double
Julian day (days).

Returns

double
Delta T (s).

References

Expand source code
def DeltaT(jd):
    """Return the value of DeltaT through interpolation.
    
    For the date range -700 - now, the value for Delta T is obtained by interpolation of known historical
      values.  Outside this range, a lenghtening of the day of 1.8 ms/century is assumed, as well as that the
      minimum of the parabola is DeltaT=12s in 1820.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  Delta T (s).
    
    References:
      - [International Earth Rotation and Reference Systems Service](ftp://maia.usno.navy.mil/ser7/deltat.data) of the U.S. Naval Observatory.
      - [Robert van Gent's website on Delta T](https://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm).
      - [Extrapolation of Delta T](https://hemel.waarnemen.com/Computing/deltat.html).
    
    """
    
    # Known data:
    years = [-700,-600,-500,-400,-300,-200,-100,0,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021]
    DTvalues = [20400,18800,17190,15530,14080,12790,11640,10580,9600,8640,7680,6700,5710,4740,3810,2960,2200,1570,1090,740,490,320,200,120,124,119,115,110,106,102,98,95,91,88,85,82,79,77,74,72,70,67,65,63,62,60,58,57,55,54,53,51,50,49,48,47,46,45,44,43,42,41,40,38,37,36,35,34,33,32,31,30,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,14,13,12,12,11,11,10,10,10,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,14,14,14,14,14,14,14,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,16,16,16,16,15,15,14,14,13.7,13.4,13.1,12.9,12.7,12.6,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.4,12.3,12.2,12.0,11.7,11.4,11.1,10.6,10.2,9.6,9.1,8.6,8.0,7.5,7.0,6.6,6.3,6.0,5.8,5.7,5.6,5.6,5.6,5.7,5.8,5.9,6.1,6.2,6.3,6.5,6.6,6.8,6.9,7.1,7.2,7.3,7.4,7.5,7.6,7.7,7.7,7.8,7.8,7.88,7.82,7.54,6.97,6.40,6.02,5.41,4.10,2.92,1.82,1.61,0.10,-1.02,-1.28,-2.69,-3.24,-3.64,-4.54,-4.71,-5.11,-5.40,-5.42,-5.20,-5.46,-5.46,-5.79,-5.63,-5.64,-5.80,-5.66,-5.87,-6.01,-6.19,-6.64,-6.44,-6.47,-6.09,-5.76,-4.66,-3.74,-2.72,-1.54,-0.02,1.24,2.64,3.86,5.37,6.14,7.75,9.13,10.46,11.53,13.36,14.65,16.01,17.20,18.24,19.06,20.25,20.95,21.16,22.25,22.41,23.03,23.49,23.62,23.68,24.49,24.34,24.08,24.02,24.00,23.87,23.95,23.86,23.93,23.73,23.92,23.96,24.02,24.33,24.83,25.30,25.70,26.24,26.77,27.28,27.78,28.25,28.71,29.15,29.57,29.97,30.36,30.72,31.07,31.35,31.68,32.18,32.68,33.15,33.59,34.00,34.47,35.03,35.73,36.54,37.43,38.29,39.20,40.18,41.17,42.23,43.37,44.4841,45.4761,46.4567,47.5214,48.5344,49.5861,50.5387,51.3808,52.1668,52.9565,53.7882,54.3427,54.8712,55.3222,55.8197,56.3000,56.8553,57.5653,58.3092,59.1218,59.9845,60.7853,61.6287,62.2950,62.9659,63.4673,63.8285,64.0908,64.2998,64.4734,64.5736,64.6876,64.8452,65.1464,65.4574,65.7768,66.0699,66.3246,66.6030,66.9069,67.2810,67.6439,68.1024,68.5927,68.9677,69.2202,69.87,70.4]
    
    year = jd2year(jd)  # Year with fraction for jd of interest
    
    if(year < years[0]):     # Before -700
        jd0 = julianDay(years[0], 1, 1)
        return DeltaT1820(jd) - DeltaT1820(jd0) + DTvalues[0]
    
    elif(year > years[-1]):  # in the future
        jd1 = julianDay(years[-1], 1, 1)
        return DeltaT1820(jd) - DeltaT1820(jd1) + DTvalues[-1]
    
    else:                    # linear interpolation from known data
        return np.interp(year, years, DTvalues)


def histastro.datetime.DeltaT1820 (jd)

Return a rough estimate for the value of Delta T.

A lenghtening of the day of 1.8 ms/century is assumed, as well as and that the minimum of the parabola is DeltaT=12s in 1820.

Args

jd : double
Julian day (days).

Returns

double
Delta T (s).

References

Expand source code
def DeltaT1820(jd):
    """
    Return a rough estimate for the value of Delta T.
    
    A lenghtening of the day of 1.8 ms/century is assumed, as well as and that the minimum of the parabola is
    DeltaT=12s in 1820.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  Delta T (s).
    
    References:
      - [Extrapolation of Delta T](https://hemel.waarnemen.com/Computing/deltat.html).
    
    """
    
    # return 12 + 0.5 * 1.8e-3/86400/(36525*86400) * ((jd-jd1820)*86400)**2
    return 12 + 0.5 * 1.8e-3 / 36525 * (jd-jd1820)**2  # simplified


def histastro.datetime.gmst (jd)

Calculate Greenwich Mean Sidereal Time for any instant, in radians.

Args

jd : double
Julian day (days).

Returns

double
gmst: Greenwich mean sidereal time (rad).

References

  • Explanatory Supplement to the Astronomical Almanac, 3rd ed, Eq. 6.66 (2012).
Expand source code
def gmst(jd):
    """
    Calculate Greenwich Mean Sidereal Time for any instant, in radians.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  gmst: Greenwich mean sidereal time (rad).
    
    References:
      - Explanatory Supplement to the Astronomical Almanac, 3rd ed, Eq. 6.66 (2012).
    
    """
    
    tjd  = jd - jd2000                      # Julian Days after 2000.0 UT
    tjd2 = tjd**2
    tjd4 = tjd2**2
           
    gmst = 4.89496121088131 + 6.30038809894828323*tjd + 5.05711849e-15*tjd2 - 4.378e-28*tjd2*tjd - 8.1601415e-29*tjd4 \
        - 2.7445e-36*tjd4*tjd  # Eq. 6.66, removed Delta-T term, hence replaced the first term
    
    return gmst % pi2


def histastro.datetime.jd2cal (jd)

Compute the calendar date from a given Julian Day.

Notes

  • Date and time are expressed in UT.
  • Decimals can be returned in the day to indicate the time of day, e.g. 1.0 for midnight and 1.5 for noon on the first day of the month.

Args

jd : double
Julian day (days).

Returns

tuple : int,int,double

Tuple containing (year, month, day):

  • year (int): Year CE (UT). Note that year=0 indicates 1 BCE.
  • month (int): Month number of year (UT; 1-12).
  • day (double): Day of month with fraction (UT; 1.0-31.999).
Expand source code
def jd2cal(jd):
    """
    Compute the calendar date from a given Julian Day.
    
    Notes:
      - Date and time are expressed in UT.
      - Decimals can be returned in the day to indicate the time of day, e.g. 1.0 for midnight and 1.5 for
        noon on the first day of the month.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      tuple (int,int,double):  Tuple containing (year, month, day):
    
        - year (int):    Year CE (UT).  Note that year=0 indicates 1 BCE.
        - month (int):   Month number of year (UT; 1-12).
        - day (double):  Day of month with fraction (UT; 1.0-31.999).

    """
    
    z = m.floor(jd+0.5)
    f = jd + 0.5 - z
    if(z < 2299161):   # Use the Julian calendar
       a = z
    else:              # Use the Gregorian calendar
       alpha = m.floor((z-1867216.25)/36524.25)
       a = z + 1 + alpha - m.floor(alpha/4.)
    
    b = a + 1524
    c = m.floor((b - 122.1)/365.25)
    d = m.floor(365.25*c)
    e = m.floor((b-d)/30.6001)
    day = b - d - m.floor(30.6001*e) + f
    
    if(e < 14):
       month = int(e - 1)
    else:
       month = int(e - 13)
       
    if(month > 2):
       year = int(c - 4716)
    else:
       year = int(c - 4715)
       
    return year,month,day


def histastro.datetime.jd2tjc (jd)

Compute the time in Julian centuries since 2000.0.

Args

jd : double
Julian day (days).

Returns

double
tjc: Time in Julian centuries since 2000.0 (UT).
Expand source code
def jd2tjc(jd):
    """
    Compute the time in Julian centuries since 2000.0.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  tjc: Time in Julian centuries since 2000.0 (UT).
    
    """
    
    return (jd - 2451545.0)/36525


def histastro.datetime.jd2tjm (jd)

Compute the time in Julian millennia since 2000.0.

Args

jd : double
Julian day (days).

Returns

double
tjm: Time in Julian millennia since 2000.0 (UT).
Expand source code
def jd2tjm(jd):
    """
    Compute the time in Julian millennia since 2000.0.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  tjm: Time in Julian millennia since 2000.0 (UT).
    
    """
    
    return (jd - 2451545.0)/365250


def histastro.datetime.jd2year (jd)

Compute a year with fraction from a given Julian Day.

Args

jd : double
Julian day (days).

Returns

double
Year CE, with decimals. Note that year=0 indicates 1 BCE.
Expand source code
def jd2year(jd):
    """
    Compute a year with fraction from a given Julian Day.
    
    Args:
      jd (double):  Julian day (days).
    
    Returns:
      double:  Year CE, with decimals.  Note that year=0 indicates 1 BCE.
    
    """
    
    year,month,day = jd2cal(jd)     # Compute current year
    jd0 = julianDay(year,   1, 1)   # Jan 1 of current year
    jd1 = julianDay(year+1, 1, 1)   # Jan 1 of next year
    dy  = (jd-jd0) / (jd1-jd0)      # Linear interpolation for fractional year
    
    return year + dy


def histastro.datetime.julianDay (year, month, day)

Compute the Julian Day for a given year, month and day.

Notes

  • Date and time are expressed in UT.
  • Decimals can be used in the day to take into account the time of day other than midnight, e.g. 1.5 for noon on the first day of the month.

Args

year : int
Year CE (UT). Note that year=0 = 1 BCE.
month : int
Month number of year (UT; 1-12).
day : double
Day of month with fraction (UT; 1.0-31.999).

Returns

double
jd: Julian day (days).
Expand source code
def julianDay(year,month,day):
    """Compute the Julian Day for a given year, month and day.
    
    Notes:
      - Date and time are expressed in UT.
      - Decimals can be used in the day to take into account the time of day other than midnight, e.g. 1.5 for
        noon on the first day of the month.
    
    Args:
      year (int):    Year CE (UT).  Note that year=0 = 1 BCE.
      month (int):   Month number of year (UT; 1-12).
      day (double):  Day of month with fraction (UT; 1.0-31.999).
    
    Returns:
      double:  jd: Julian day (days).

    """
    
    year0 = year
    if month <= 2:  # Jan and Feb are month 13 and 14 of the previous year
       year -= 1
       month += 12
       
    b = 0; a=0
    if year0 > 1582:     # Assume a Gregorian date
       a = m.floor(year/100.0)
       b = 2 - a + m.floor(a/4.0)
       
    jd = m.floor(365.25*(year+4716)) + m.floor(30.6001*(month+1)) + day + b - 1524.5
    
    return jd