在python中计算朱利安日期

时间:2015-06-30 15:15:54

标签: python-2.7 julian-date

我试图在python中创建一个julian日期并且有重大的挣扎。那里什么都没有那么简单:

jul = juliandate(year,month,day,hour,minute,second)

其中jul会像2457152.0(小数随时间而变化)?

我已尝试过jdcal,但无法弄清楚如何添加时间组件(jdcal.gcal2jd()只接受年,月和日)。

6 个答案:

答案 0 :(得分:2)

不是纯Python解决方案,但您可以在具有julianday()函数的内存db中使用SQLite:

import sqlite3
con = sqlite3.connect(":memory:")
list(con.execute("select julianday('2017-01-01')"))[0][0]

返回:2457754.5

答案 1 :(得分:1)

Extract day of year and Julian day from a string date in python回答一个问题。不需要图书馆。 答案二是来自https://pypi.python.org/pypi/jdcal

的图书馆

答案 2 :(得分:1)

简单的软糖通过维基的数字脚本也不知道。请注意,这是使用Python 3.6编写的,因此我不确定它是否适用于Python 2.7,但这也是一个老问题。

def julian_day(now):
    """
    1. Get current values for year, month, and day
    2. Same for time and make it a day fraction
    3. Calculate the julian day number via   https://en.wikipedia.org/wiki/Julian_day
    4. Add the day fraction to the julian day number

    """
    year = now.year
    month = now.month
    day = now.day
    day_fraction = now.hour + now.minute / 60.0 + now.second / 3600.0 / 24.0

    # The value 'march_on' will be 1 for January and February, and 0 for other months.
    march_on = math.floor((14 - month) / 12)
    year = year + 4800 - march_on
    # And 'month' will be 0 for March and 11 for February. 0 - 11 months
    month = month + 12 * march_on - 3

    y_quarter = math.floor(year / 4)
    jdn = day + math.floor((month * 153 + 2) / 5) + 365 * year + y_quarter

    julian = year < 1582 or year == (1582 and month < 10) or (month == 10 and day < 15)
    if julian:
        reform = 32083 # might need adjusting so needs a test
    else:
        reform = math.floor(year / 100) + math.floor(year / 400) + 32030.1875 # fudged this

    return jdn - reform + day_fraction

通常这只是为了自己尝试,因为最常见的算法给我带来了麻烦。这是有效的,如果您搜索它并使用它编写脚本,因为它有多种语言。但是这个文档中的步骤试图保持简单。最重要的决定是你多久会去寻找格列高利改革之前的日期。这就是为什么我从来没有测试过,但继续玩它,因为它需要大量的按摩。 :-D至少我认为符合PEP8,即使它不符合最佳实践。来吧,pylint吧。

你可以使用像PyEphem这样的源代码包,或者其他什么,但你仍然想知道它是怎么回事,所以你可以编写自己的测试。我会为您链接PyEphem但是有很多现成的包都有Julian Day计算。

如果您正在使用这些类型的数字进行大量工作,最好的办法是获取J2000等常量列表。

datetime.datetime(2000, 1, 1, 12, 0, 0, tzinfo=datetime.timezone.utc)

datetime.datetime.toordinal() + 1721425 - 0.5 # not tested

# or even
datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc)

如果你熟悉datetime库的功能,那么解决这些问题就不那么难了。只是为了好玩,你注意到了PyEphem的标志吗?我怀疑它来自this

之类的东西

我看到的一篇帖子似乎有效,但没有测试jiffyclub

现在,这是使用日期时间对象计算两个值的更常用方法。

def jdn(dto):
"""
Given datetime object returns Julian Day Number
"""
year = dto.year
month = dto.month
day = dto.day

not_march = month < 3
if not_march:
    year -= 1
    month += 12

fr_y = math.floor(year / 100)
reform = 2 - fr_y + math.floor(fr_y / 4)
jjs = day + (
    math.floor(365.25 * (year + 4716)) + math.floor(30.6001 * (month + 1)) + reform - 1524)
if jjs < ITALY:
    jjs -= reform

return jjs
# end jdn

def ajd(dto):
"""
Given datetime object returns Astronomical Julian Day.
Day is from midnight 00:00:00+00:00 with day fractional
value added.
"""
jdd = jdn(dto)
day_fraction = dto.hour / 24.0 + dto.minute / 1440.0 + dto.second / 86400.0
return jdd + day_fraction - 0.5
# end ajd

它可能不是Python中的最佳实践,但你确实问过如何计算它不仅仅是获取它或提取它,尽管如果这是你想要的那些问题已经被解答了。

答案 3 :(得分:1)

在这里-具有日期时间和数学库的纯python解决方案。

这是基于此处找到的海军天文方程式,并使用自己的计算器进行验证的:http://aa.usno.navy.mil/faq/docs/JD_Formula.php

import datetime
import math

def get_julian_datetime(date):
    """
    Convert a datetime object into julian float.
    Args:
        date: datetime-object of date in question

    Returns: float - Julian calculated datetime.
    Raises: 
        TypeError : Incorrect parameter type
        ValueError: Date out of range of equation
    """

    # Ensure correct format
    if not isinstance(date, datetime.datetime):
        raise TypeError('Invalid type for parameter "date" - expecting datetime')
    elif date.year < 1801 or date.year > 2099:
        raise ValueError('Datetime must be between year 1801 and 2099')

    # Perform the calculation
    julian_datetime = 367 * date.year - int((7 * (date.year + int((date.month + 9) / 12.0))) / 4.0) + int(
        (275 * date.month) / 9.0) + date.day + 1721013.5 + (
                          date.hour + date.minute / 60.0 + date.second / math.pow(60,
                                                                                  2)) / 24.0 - 0.5 * math.copysign(
        1, 100 * date.year + date.month - 190002.5) + 0.5

    return julian_datetime

用法示例:

# Set the same example as the Naval site.
example_datetime = datetime.datetime(1877, 8, 11, 7, 30, 0)
print get_julian_datetime(example_datetime)

答案 4 :(得分:0)

Try https://www.egenix.com/products/python/mxBase/mxDateTime/

First construct a DateTime object via the syntax

DateTime(year,month=1,day=1,hour=0,minute=0,second=0.0)

Then you can use '.jdn' object method to get the value you are looking for.

答案 5 :(得分:0)

最简单的方法:df ['Julian_Dates'] = df.index.to_julian_date()。您需要将日期时间列设置为索引(使用熊猫)。

有一种使用Astropy的方法。首先,将您的时间更改为列表(t)。其次,将该列表更改为灾难性的时间(Time)。最后,计算您的JD或MJD(t.jd t.mjd)。
https://docs.astropy.org/en/stable/time/

对于df: t =时间(DF.JulianDates,format ='jd',scale ='utc')