[PYTHON] Comment calculer le jour Julius

Lorsque j'étudiais comment calculer le jour Julius, je me demandais lequel était correct car la formule était gousset en fonction de la source, alors je l'ai organisé pour le moment. Je les ai également comparés, et même si j'ai trouvé qu'il y avait des différences dans les résultats de chaque méthode de calcul, on ne sait pas laquelle est correcte ou s'il est possible de dire qu'une méthode est correcte en premier lieu. Tel quel.

Comment calculer le jour Julius

[wikipedia / Numéro du jour julien (JDN)](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82% Selon B9% E9% 80% 9A% E6% 97% A5 # Julian_Day_Number_ (JDN))

La formule de conversion a été élaborée par Fliegel et Van Flandern [13], Hatcher [14], Meeus [15]. Cependant, les formules de conversion qui ont été arrangées sont souvent utilisées [16].

Il semble que la formule ait plusieurs formes. Les formules dans wikipedia et les formules dans d'autres documents sont énumérées ci-dessous.

La forme de chaque formule est assez différente, mais est-elle vraiment équivalente?

méthode wikipedia

[wikipedia / Stellar time # Méthode de calcul du temps stellaire](https://ja.wikipedia.org/wiki/%E6%81%92%E6%98%9F%E6%99%82#%E6%81%92 % E6% 98% 9F% E6% 99% 82% E3% 81% AE% E8% A8% 88% E7% AE% 97% E6% B3% 95)

\begin{aligned}
JD = & \left\lfloor 365.25 Y \right\rfloor + \left \lfloor \frac{Y}{400} \right\rfloor - \left\lfloor \frac{Y}{100} \right\rfloor + \left\lfloor 30.59 \left( M-2 \right) \right\rfloor + D + 1721088.5 \\
& + \frac{h}{24} + \frac{m}{1440} + \frac{s}{86400} \\
\\
& \lfloor x \rfloor est une fonction de plancher
\end{aligned}

Soit l'année Gregorio actuelle de UT, Y, le mois, M, le jour, D, l'heure, h, la minute, m et la seconde, s. Cependant, janvier et février sont remplacés par mars et 14 de l'année précédente (la valeur Y est décrémentée de -1) (Exemple: dans le cas du 5 février 2013, Y = 2012, M = 14, D = Cinq).

Méthode de Fliegel et al.

Fliegel, H. F. and Van Flandern, T. C., "A Machine Algorithm for Processing Calendar Dates," Communications of the ACM 11, p. 657, 1968.

\begin{aligned}
JD(I,J,K) = & K - 32075 + 1461 * (I + 4800 + (J - 14) / 12) / 4 \\
& + 367 * (J - 2 - (J - 14) / 12 * 12) / 12 \\
& - 3 * ((I + 4900 + (J - 14) / 12 ) / 100 ) / 4
\end{aligned}

calendar date (I = year; J = month, a number from 1 to 12; K = day of month) to a Julian Date (JD)

COMPUTATION AND MEASUREMENT PROBLEM 11.

In FORTRAN integer arithmetic, multiplication and division are performed left to right in the order of occurrence, and the absolute value of each result is truncated to the next lower integer value after each operation, so that both 2/12 and -2/12 become 0.

La multiplication et la division sont effectuées de gauche à droite, chaque fois que la valeur absolue du calcul est arrondie à la valeur entière inférieure suivante.

wikipedia / Julian day#Converting Gregorian calendar date to Julian Day Number

The algorithm[61] is valid for all (possibly proleptic) Gregorian calendar dates after November 23, −4713. Divisions are integer divisions, fractional parts are ignored.

Si vous modifiez l'expression pour qu'elle soit plus facile à comparer avec d'autres,

\begin{aligned}
JD = & D - 32075 + \left\lfloor \frac{ 1461 \left( Y + 4800 + \left\lfloor \frac{M - 14}{12} \right\rfloor \right)}{4} \right\rfloor \\
& + \left\lfloor \frac{ 367 \left( M - 2 - 12 \left\lfloor \frac{M - 14}{12} \right\rfloor \right) }{12} \right\rfloor \\
& - \left\lfloor \frac{ 3 \left\lfloor \frac{ Y + 4900 + \left\lfloor \frac{M - 14}{12} \right\rfloor }{100} \right\rfloor }{ 4 } \right\rfloor
\end{aligned}

Méthode Hatcher

Hatcher, D. A., Simple formulae for Julian day numbers and calendar dates, Quarterly Journal of the Royal Astronomical Society, v. 25, p. 53-55, 1984

\begin{aligned}
Y' & = Y + y - ((n + m - 1 - M) / n) \text{INT} \\
M' & = (M - m) \text{MOD } n \\
D' & = D - 1 \\
J & = ((pY' + q) / r) \text{INT} + ((sM' + t) / u) \text{INT} + D' -j
\end{aligned}

Y, M, D and Y', M', D' are the year, month and day of month

(x) INT is the integral part of x, and x is assumed to be positive; (x) MOD y is the positive remainder on divideing x by y.

(x) INT est la partie entière de x et x est supposé positif. (x) MOD est un reste positif obtenu en divisant x par y.

Pour la conversion du calendrier Gregorio

y j m n r p q v u s t w
4716 1401+g 3 12 4 1461 - 3 5 153 2 2
g = (((Y' + 184) / 100) \text{INT} \times 3/4) \text{INT} - 38

Par conséquent, si vous le remplacez dans la formule ci-dessus

\begin{aligned}
Y' = & Y + 4716 - \left( \frac{14 - M}{12} \right) \text{INT} \\
M' = & (M - 3) \text{MOD } 12 \\
D' = & D - 1 \\
J = & \left( \frac{1461 Y'}{4} \right) \text{INT} + \left( \frac{153M' + 2}{5} \right) \text{INT} + D' \\
& - \left( 1401 + \left( \frac{Y' + 184}{100} \right) \text{INT} \times \frac{3}{4} \right) \text{INT} - 38 \\
= & \left( 365.25Y' \right) \text{INT} + \left( 30.6M' + 0.4 \right) \text{INT} + D' \\
& - \left( 1401 + \left( \frac{Y' + 184}{100} \right) \text{INT} \times \frac{3}{4} \right) \text{INT} - 38
\end{aligned}

Méthode Meeus

Meeus, J., Astronomical Algorithms, 1998

\begin{aligned}
A & = \text{INT} \left( \frac{Y}{100} \right) \\
B & = 2 - A + \text{INT} \left( \frac{A}{4} \right) \\
JD & = \text{INT} (365.25 (Y + 4716)) + \text{INT} (30.6001(M + 1)) + D + B - 1524.5
\end{aligned}

Let Y be the year, M the month number (1 for January, 2 for February, etc., to 12 for December), and D the day of month (with decimals, if any) of the given calendar date.

INT(x) the greatest integer less than or equal to x.

for instance, INT(-7.83) = -8

Si vous modifiez l'expression pour qu'elle soit plus facile à comparer avec d'autres,

\begin{aligned}
JD & = \left\lfloor 365.25 (Y + 4716) \right\rfloor + \left\lfloor 30.6001(M + 1) \right\rfloor + D + 2 - \left\lfloor \frac{Y}{100} \right\rfloor + \left\lfloor \frac{ \left\lfloor \frac{Y}{100} \right\rfloor }{4} \right\rfloor - 1524.5 \\
& = \left\lfloor 365.25 Y \right\rfloor + \left\lfloor 30.6001(M + 1) \right\rfloor + D - \left\lfloor \frac{Y}{100} \right\rfloor + \left\lfloor \frac{Y}{400} \right\rfloor + ‭1,720,996.5‬ \\
& = 365 Y + \left\lfloor \frac{Y}{4} \right\rfloor - \left\lfloor \frac{Y}{100} \right\rfloor + \left\lfloor \frac{Y}{400} \right\rfloor + \left\lfloor 30.6001(M + 1) \right\rfloor + D + ‭1,720,996.5‬
\end{aligned}

Méthode de Vallado et al.

CelesTrak / Revisiting Spacetrack Report #3 - AIAA 2006-6753-Sourcecode(C++) Vallado, David A., Paul Crawford, Richard Hujsak, and T.S. Kelso, "Revisiting Spacetrack Report #3," presented at the AIAA/AAS Astrodynamics Specialist Conference, Keystone, CO, 2006 August 21–24.

\begin{aligned}
jd = & 367.0 * year - \\
& floor((7 * (year + floor((mon + 9) / 12.0))) * 0.25) + \\
& floor(275 * mon / 9.0) + day + 1721013.5 + \\
& ((sec / 60.0 + minute) / 60.0 + hr) / 24.0 \\
\end{aligned}

Si vous modifiez l'expression pour qu'elle soit plus facile à comparer avec d'autres,

\begin{aligned}
JD = & 367 Y - \left\lfloor \frac{7}{4} \left(Y + \left\lfloor \frac{M + 9}{12} \right\rfloor \right) \right\rfloor + \left\lfloor \frac{275 M}{9} \right\rfloor + D + 1721013.5 \\
& + \frac{h}{24} + \frac{m}{1440} + \frac{s}{86400}
\end{aligned}

Méthode de Howard D. Curtis

ScienceDirect / Julian Day Number Howard D. Curtis, in Orbital Mechanics for Engineering Students (Fourth Edition), 2020

\begin{aligned}
J_0 = & 367 y - \text{INT} \frac{7 y + \text{INT} \frac{m + 9}{12}}{4} + \text{INT} \frac{275 m}{9} + d + 1,721,013.5 \\
& 1901 \le y \le 2099 \\
& 1 \le m \le 12 \\
& 1 \le d \le 31
\end{aligned}

INT(x) means retaining only the integer portion of x, without rounding (or, in other words, round toward zero). For example, INT(− 3.9) = −3 and INT(3.9) = 3.

ScienceDirect / Julian Day Number Howard D. Curtis, in Orbital Mechanics for Engineering Students (Third Edition), 2014

\begin{aligned}
J_0 = & 367 y - \text{INT} \left\{ \frac{7 \left[ y + \text{INT} \left( \frac{m + 9}{12} \right) \right] }{4} \right\} + \text{INT} \left( \frac{275 m}{9} \right) + d + 1,721,013.5 \\
& 1901 \le y \le 2099 \\
& 1 \le m \le 12 \\
& 1 \le d \le 31
\end{aligned}

INT (x) means to retain only the integer portion of x, without rounding (or, in other words, round toward zero), that is, INT (−3.9) = −3 and INT (3.9) = 3

Dans la quatrième et troisième édition ci-dessus, la plage couverte par le 7 dans la molécule du deuxième terme est différente.

méthode de bibliothèque boost

boost/date_time/gregorian_calendar.ipp

  //! Convert a ymd_type into a day number
  /*! The day number is an absolute number of days since the start of count
   */
  template<typename ymd_type_, typename date_int_type_>
  BOOST_DATE_TIME_INLINE
  date_int_type_
  gregorian_calendar_base<ymd_type_,date_int_type_>::day_number(const ymd_type& ymd)
  {
    unsigned short a = static_cast<unsigned short>((14-ymd.month)/12);
    unsigned short y = static_cast<unsigned short>(ymd.year + 4800 - a);
    unsigned short m = static_cast<unsigned short>(ymd.month + 12*a - 3);
    unsigned long  d = ymd.day + ((153*m + 2)/5) + 365*y + (y/4) - (y/100) + (y/400) - 32045;
    return static_cast<date_int_type>(d);
  }

  //! Convert a year-month-day into the julian day number
  /*! Since this implementation uses julian day internally, this is the same as the day_number.
   */
  template<typename ymd_type_, typename date_int_type_>
  BOOST_DATE_TIME_INLINE
  date_int_type_
  gregorian_calendar_base<ymd_type_,date_int_type_>::julian_day_number(const ymd_type& ymd)
  {
    return day_number(ymd);
  }

Si vous modifiez l'expression pour qu'elle soit plus facile à comparer avec d'autres,

\begin{aligned}
a & = \text{INT} \left( \frac{14 - M}{12} \right) \\
y & = Y + 4800 - a \\
m & = M + 12 a - 3 \\
JD & = \text{INT} \left( D + \frac{153m + 2}{5} + 365 y + \frac{y}{4} - \frac{y}{100} + \frac{y}{400} - 32045 \right)
\end{aligned}

Méthode PHP

PHP> Manuel> Référence des fonctions> Date et heure liées> Calendrier> Fonction de calendrier gregoriantojd

gregoriantojd - Convertir les jours Gregorius en jours d'intégration Julius

Bien qu'il s'agisse d'une fonction PHP, il semble que la substance soit implémentée en C comme suit.

php-src/ext/calendar/calendar.stub.php

php:calendar.stub.ph


function gregoriantojd(int $month, int $day, int $year): int {}

php-src/ext/calendar/calendar.c

calendar.c


/* {{{ proto int gregoriantojd(int month, int day, int year)
   Converts a gregorian calendar date to julian day count */
PHP_FUNCTION(gregoriantojd)
{
	zend_long year, month, day;

	if (zend_parse_parameters(ZEND_NUM_ARGS(), "lll", &month, &day, &year) == FAILURE) {
		RETURN_THROWS();
	}

	RETURN_LONG(GregorianToSdn(year, month, day));
}
/* }}} */

php-src/ext/calendar/gregor.c

gregor.c


zend_long GregorianToSdn(
						   int inputYear,
						   int inputMonth,
						   int inputDay)
{
	zend_long year;
	int month;

	/* check for invalid dates */
	if (inputYear == 0 || inputYear < -4714 ||
		inputMonth <= 0 || inputMonth > 12 ||
		inputDay <= 0 || inputDay > 31) {
		return (0);
	}
	/* check for dates before SDN 1 (Nov 25, 4714 B.C.) */
	if (inputYear == -4714) {
		if (inputMonth < 11) {
			return (0);
		}
		if (inputMonth == 11 && inputDay < 25) {
			return (0);
		}
	}
	/* Make year always a positive number. */
	if (inputYear < 0) {
		year = inputYear + 4801;
	} else {
		year = inputYear + 4800;
	}

	/* Adjust the start of the year. */
	if (inputMonth > 2) {
		month = inputMonth - 3;
	} else {
		month = inputMonth + 9;
		year--;
	}

	return (((year / 100) * DAYS_PER_400_YEARS) / 4
			+ ((year % 100) * DAYS_PER_4_YEARS) / 4
			+ (month * DAYS_PER_5_MONTHS + 2) / 5
			+ inputDay
			- GREGOR_SDN_OFFSET);
}

Si vous modifiez l'expression pour qu'elle soit plus facile à comparer avec d'autres,

\begin{aligned}
Y' & = \left\{
    \begin{aligned}
        Y + 4801 \quad (Y < 0) \\
        Y + 4800 \quad (Y \ge 0)
    \end{aligned}
\right. \\
M' & = \left\{
    \begin{aligned}
        & M - 3 & (M > 2) \\
        & M + 9, \quad Y' = Y' - 1 & (M \le 2)
    \end{aligned}
\right. \\
JD & = \text{INT} \left( \frac{ \frac{Y'}{100} \times 146097 }{4} + \frac{(Y' \% 100) \times 1461}{4} + \frac{153 M' + 2}{5} + D - 32045 \right)
\end{aligned}

méthode pyorbitaire

pyorbital/pyorbital/__init__.py

__init__.py


def dt2np(utc_time):
    try:
        return np.datetime64(utc_time)
    except ValueError:
        return utc_time.astype('datetime64[ns]')

pyorbital/pyorbital/astronomy.py

astronomy.py


def jdays2000(utc_time):
    """Get the days since year 2000.
    """
    return _days(dt2np(utc_time) - np.datetime64('2000-01-01T12:00'))


def jdays(utc_time):
    """Get the julian day of *utc_time*.
    """
    return jdays2000(utc_time) + 2451545


def _days(dt):
    """Get the days (floating point) from *d_t*.
    """
    return dt / np.timedelta64(1, 'D')

En d'autres termes

JD =  UTC(Y,M,D,h,m,s) - UTC(2000, 1, 1, 12, 0, 0) + 2451545

Méthode de la page Web de l'Observatoire astronomique national

Observatoire astronomique national / Julius Day

Après le 15 octobre 1582, les dates seront selon les règles du calendrier Gregorio et avant cela, le calendrier Julius. L'année précédant la première année de l'AD est de 0 an. Pour cette raison, il y a une différence d'année en année par rapport à la méthode de réglage à 1 BC.

Vous pouvez calculer la date Julius en remplissant un formulaire Web. Sortie dans un fichier CSV pour comparaison avec les résultats d'autres méthodes de calcul. Comme il est difficile de saisir manuellement, envoyez une requête au formulaire Web avec python, obtenez le résultat et affichez-le au format CSV.

Code Python

Vous trouverez ci-dessous un graphique CSV généré par le code ci-dessus. Sur ce site Web, -4712/01/01 12:00 est la valeur minimale (jour Julius = 0,0 jour).

--- Vers 4712 (-4712/01/01 ~ -4711/12/01) JulianDay_by_NAOJ_-47120101_-47111201.png

--Environ 0 ans (0001/01/01 ~ -0001/12/01) JulianDay_by_NAOJ_-00010101_00011201.png

--Octobre 1582 (1582/10/01 ~ 1582/10/31) lorsque le calendrier Gregorio a commencé JulianDay_by_NAOJ_15821001_15821031.png

Puisque le jour après le 1582/10/04, le dernier jour du calendrier Julius, est le 1582/10/15, le premier jour du calendrier Gregorio, la page Web renvoie également des résultats de cette manière. De plus, les valeurs du 10/05 au 10/14 n'existent pas. Peut-être à cause de cela, 10/15 est après 10/24. Quoi qu'il en soit, le jour Julius du 10/04 est 2299160, et le jour Julius du 10/15 est 2299161, et le résultat linéaire que la valeur ne vole pas est maintenu.

Comparaison des résultats de calcul de chaque méthode

Code Python pour comparaison

Axe horizontal: calendrier Gregorio (je trouve qu'il n'est pas approprié d'appeler le calendrier Gregorio avant 1582/10/15 ...) Axe vertical: jour Julius

En ce qui concerne NAOJ (résultat du calcul sur le site de l'Observatoire astronomique national), comme il est inquiétant de la charge et du temps de calculer de 4713 à 2000 par incréments d'un mois, seule la période suivante est calculée, et elle est indiquée dans le graphique. Est également tracé uniquement dans la période suivante.

--- Vers 4712 (-4712/01/01 ~ -4711/12/01) --Environ 0 ans (0001/01/01 ~ -0001/12/01) --Octobre 1582 (1582/10/01 ~ 1582/10/31) lorsque le calendrier Gregorio a commencé

-4713-2000

-4713/01/01 ~ 2000/12/01 est calculé par incréments d'un mois (1er de chaque mois).

JulianDayCompare_-47130101_20001201.png

À vol d'oiseau, toutes les méthodes de calcul ont presque les mêmes valeurs et les résultats sont presque linéaires.

-Vue agrandie vers 4713

Calculé de -4713/01/01 à -4711/12/01 par incréments d'un mois (1er de chaque mois).

JulianDayCompare_-47130101_-47111201.png

Concernant NAOJ (résultat du calcul sur le site de l'Observatoire National d'Astronomie), -4712/01/01 12:00 est la valeur minimale (julius jour = 0,0 jour) sur ce site, donc ça a commencé en -4712.

Vue agrandie vers 0 ans

Calculé de -0001/01/01 à 0001/12/01 par incréments d'un mois (1er jour de chaque mois).

JulianDayCompare_-00010101_00011201.png

Seul php est discontinu de décembre 0001 à janvier 0000, et on pense que php traite "1 an avant JC suivi de 1 an avant JC". A en juger par la valeur de Julius day, 0 BC est le même que 1 BC. Au contraire, dans des méthodes autres que php, il semble qu'il soit traité comme "1 BC → 0 BC → 1 an AD".

Vue agrandie vers 0 an, mais hors 0 an

Calculé de -0001/01/01 à -0001/12/01 et de 0001/01/01 à 0001/12/01 par incréments d'un mois (1er jour de chaque mois).

JulianDayCompare_-00010101_00011201_exceptYear0.png

Comme mentionné ci-dessus, si vous essayez de dessiner un graphe excluant 0 an, seul php sera continu et les autres méthodes seront discontinues.

Vue agrandie d'octobre 1582, lorsque le calendrier Gregorio a commencé

Calculé du 1582/10/01 au 1582/10/31 par incréments d'un jour.

JulianDayCompare_15821001_15821031.png

En ce qui concerne NAOJ (résultat du calcul sur le site de l'Observatoire National d'Astronomie), le lendemain du 1582/10/04, qui est le dernier jour du calendrier Julius, sera le 1582/10/15, qui est le premier jour du calendrier Gregorio. Il n'y a pas de valeur pour / 05-10 / 14 car elle n'est pas incluse dans le calcul du jour Julius.

Différence entre les valeurs maximales et minimales

-4713/01/01 ~ 2000/12/01 est calculé par incréments d'un mois (1er de chaque mois).

JulianDayCompare_-47130101_20001201_max-min.png

Étant donné que les valeurs de jour Julius calculées varient selon les méthodes de calcul, j'ai tracé la différence entre les valeurs maximale et minimale pour voir l'ampleur de la variation. --- Différence entre 4713/01/01 et -0001/12/01: 417,5 à 381,5

Plus la différence est proche du présent.

Conclusions comparées

Bien qu'il ait été constaté qu'il existe des différences dans les résultats de chaque méthode de calcul et de la tendance, on ne sait toujours pas laquelle est correcte ou s'il est possible de dire qu'une méthode est correcte en premier lieu.

Heure en jour Julius

12:00 La date complète du calendrier Julius après UT.

\begin{aligned}
JD & = JDN + \frac{hour - 12}{24} + \frac{minute}{1440} + \frac{second}{86400} \\
JD & : \text{Julian Date} \\
JDN & : \text{Julian Day Number}
\end{aligned}

wikipedia / Julian day#Finding Julian date given Julian day number and time of day

Autre

Jour julien modifié: MJD

[wikipedia / Julius Day #Modified Julius Day (MJD)](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82% B9% E9% 80% 9A% E6% 97% A5 #% E4% BF% AE% E6% AD% A3% E3% 83% A6% E3% 83% AA% E3% 82% A6% E3% 82% B9 % E6% 97% A5% EF% BC% 88MJD% EF% BC% 89) wikipedia / Julian day#Variants Meeus, J., Astronomical Algorithms, 1998

\begin{aligned}
MJD & = JD - 2400000.5 \\
MJD & :Jour Julius modifié\\
JD & :Jour Julius
\end{aligned}

Truncated Julian Day: TJD

Qu'est-ce qui est correct, avec ou sans fonction de sol?

[wikipedia / Stellar time # Méthode de calcul du temps stellaire](https://ja.wikipedia.org/wiki/%E6%81%92%E6%98%9F%E6%99%82#%E6%81%92 % E6% 98% 9F% E6% 99% 82% E3% 81% AE% E8% A8% 88% E7% AE% 97% E6% B3% 95)

TJD = JD - 2440000.5

wikipedia / Julian day#Variants

TJD = \left\lfloor JD - 2440000.5 \right\rfloor

J2000

wikipedia / Epoch (astronomy)#Julian Dates and J2000

date that is an interval of x Julian years of 365.25 days away from the epoch J2000 = JD 2451545.0 (TT), still corresponding (in spite of the use of the prefix "J" or word "Julian") to the Gregorian calendar date of January 1, 2000, at 12h TT (about 64 seconds before noon UTC on the same calendar day).[10](See also Julian year (astronomy).) Like the Besselian epoch, an arbitrary Julian epoch is therefore related to the Julian date by

J = 2000 + ( \text{Julian date} -2451545.0 ) \div 365.25

Autres sites de référence

Jour julien Jouez avec "Julius Day" The Julian Period

[calendrier wikipedia / Gregorio](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%82%AA% E6% 9A% A6)

[Python] Acquisition de données Web par requête GET / POST (module Requests) [Python] Scraping tables using Beautiful Soup Belle soupe en 10 minutes

ticklabels empty when not interactive #6103

Recommended Posts

Comment calculer le jour Julius
[Python] Méthode de calcul avec numpy
Méthode du carré minimum (calcul de la matrice triangulaire)
Date du calendrier Gregorius modifiée par rapport à la date de Julius