[PYTHON] Umrechnung zwischen Julius-Tag und Gregorius-Kalenderdatum

Hallo. Ich habe die Umrechnung zwischen dem gregorianischen Kalenderdatum $ (Jahr, Monat, Tag) $ und der modifizierten julianischen Tages- (MJD) oder julianischen Tagesnummer (JDN) berechnet. Der Umrechnungsfluss ist wie folgt. Die Berechnungsformel finden Sie unter [Julius pendelt #Conversion aus dem westlichen Kalender](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%] 82% B9% E9% 80% 9A% E6% 97% A5 # .E8.A5.BF.E6.9A.A6.E3.81.8B.E3.82.89.E3.81.AE.E6.8F.9B. E7.AE.97) (Julianischer Tag #Calculation) Wie es ist [^ 1] [^ 2] [^ 3].

[^ 1]: Der Unterschied zwischen gregorianischen und julianischen Kalendern dieses `DELTA_N_MJD``` besteht auch darin, dass der Übereinstimmungszeitraum beider Kalender ab dem 1. März 200 n. Chr. 100 Jahre beträgt. Das kommende Jahr (nicht das erste Jahr der christlichen Ära) stammt vom Nikea-Religionsrat von 325 n. Chr., Der den Frühlingstag am 21. März festlegte. [^ 2]: Dieser Wert ist darauf zurückzuführen, dass Masako UT ( jd = 2400000.5```) am 17. November 1858 die erste MJD-Periode ist ( `` 1858.680356 * 365.25 = 678883.000```). [^ 3]: Obwohl es im Berechnungsteil von $ (y, m, d) \ leftrightarrow n $ erscheint, beträgt die durchschnittliche Anzahl der Tage pro Monat 30,6 (= 153/5) Tage und die Anzahl der Tage für 4 Jahre 1461 Tage. Die Anzahl der Tage für 400 Jahre des Gregorius-Kalenders beträgt 146097 Tage.

(year, month, day) \leftrightarrow (y, m, d) \leftrightarrow n \leftrightarrow mjd  \leftrightarrow jdn
$ ./date.py --test
True: ymd2n(0,0,0) == 0
True: date2ymd(0,3,1) == (0,0,0)
True: date2mjd(1858, 11, 17) == 0

date.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import division
from __future__ import print_function

# n: the continuous count of days since March first in 1 B.C. proleptic Gregorian
# date = (year, month, day) in the proleptic Gregorian calendar
# ymd  = (y, m, d); modified date in the proleptic Gregorian calendar (see date2ymd() below)

DELTA_N_MJD = {"Julian": 678883, "Gregorian": 678881}  # calendars

def mjd2jdn(mjd):
    return mjd + 2400001

def jdn2jd(jdn):
    return jdn - 0.5  # 00:00:00

def n2mjd(n):
    return n - DELTA_N_MJD["Gregorian"]

def mjd2n(mjd):
    return mjd + DELTA_N_MJD["Gregorian"]

def date2mjd(year, month, day):
    return n2mjd(date2n(year, month, day))

def mjd2date(mjd):
    return ymd2date(*n2ymd(mjd2n(mjd)))

def diffdate(date1, date2):
    return date2n(*date1) - date2n(*date2)

def adddate(date, d):
    n = date2n(*date) + d
    return ymd2date(n2ymd(n))

def date2n(year, month, day):
    return ymd2n(*date2ymd(year, month, day))

def date2ymd(year, month, day):
    y, m, d = year, month-3, day-1
    if m < 0:
        y, m = y-1, m%12
    return y, m, d

def ymd2date(y,m,d):
    year, month, day = y, m+3, d+1
    if month > 12:
        year, month = year+1, month%12
    return year, month, day

def ymd2n(y,m,d):
    n = d + (153*m+2)//5 + 365*y + y//4  # d + (306*m+4)//10 + (1461*y)//4
    n += -(y//100) + y//400  # (-3*(y//100))//4  [Gregorian]
    return n

def n2ymd(n):
    a = 4*n + 3
    a += 4*((3*((4*(n+1))//146097+1))//4)  # [Gregorian]
    y, b = a//1461, 5*((a%1461)//4) + 2
    m, d = b//153, (b%153)//5
    return y, m, d

def n2dayofweek(n):
   dow = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']
   return dow[(n+3)%7]  # [Gregorian]

#===== test =====
def test_eval(str):
    print(eval(str), str)
    return 0
    
def test_epoch():
    test_eval('ymd2n(0,0,0) == 0')
    test_eval('date2ymd(0,3,1) == (0,0,0)')
    test_eval('date2mjd(1858, 11, 17) == 0')
    return 0

def test_ymd2n():
    for n in range(-146097,146097):
        y,m,d = n2ymd(n)
        if n != ymd2n(y,m,d):
            year, month, day = ymd2date(y,m,d)
            print(n,'', year, month, day, 'error')
            break
    return 0

def test_n2ymd():
    m, d = 0, 0
    for y in range(-401,400):
        n = ymd2n(y,m,d)
        if (y,m,d) != n2ymd(n):
            year, month, day = ymd2date(y,m,d)
            print(n,'', year, month, day, 'error')
            break
    return 0

def main():
    """
    {f}: Conversion between modified Julian day number and Gregorian calendar date.

    usage: {f} [-h] [--test]
    
    options:
        -h, --help    show this help message and exit
        --test        test
    """
    import docopt, textwrap
    args = docopt.docopt(textwrap.dedent(main.__doc__.format(f=__file__)))
    if args.get("--test", 0):
        test_epoch()
        test_ymd2n()
        test_n2ymd()
    return 0

if __name__ == '__main__':
    main()

Recommended Posts

Umrechnung zwischen Julius-Tag und Gregorius-Kalenderdatum
Gregorius-Kalenderdatum geändert von Julius-Datum
Gegenseitige Umrechnung zwischen Datum und Tag seit dem 1. Januar 2000
Konvertierung zwischen Unixtime und Datetime
Umwandlung zwischen Singular- und Pluralwörtern
Gegenseitige Konvertierung zwischen Qiita-Artikel und Jupyter-Notizbuch
[Python] Konvertierungsnotiz zwischen Zeitdaten und numerischen Daten
Methode zum Konvertieren zwischen westlichem Kalender und japanischem Kalender
Festkomma- und Binärkonvertierung
Gegenseitige Konvertierung zwischen JSON und YAML / TOML in Python