Comment calculer la durée en heure d’une journée ? 🕒

Lors d’un développement récent sur des analyses de séries temporelles énergétiques, nous avons eu besoin de déterminer la durée d’une journée, en heures.

Nous avons donc commencer à utiliser des librairies Python telles que pvlib et son module solar_position ou suntime pour obtenir les heures de levé et couché du soleil.

Cependant, pour éviter des dépendances, nous avons continué à fouiller et sommes tombé sur une méthode originale dans un post sur Stackoverflow , qui propose une méthode simple pour estimer la durée de la journée, basée sur la latitude et le jour de l’année. Cette méthode a été développé par [Forsythe et al.]1 en 1995 !

Cette durée est décrite par la fonction suivante : $$ D = 24 - \frac{24}{\pi} \times \arccos \left[ \frac{\sin(0.8333 \times \frac{\pi}{180}) + \sin(L \times \frac{\pi}{180})\times\sin(P)}{\cos(L \times \frac{\pi}{180} \times \cos(P))} \right] $$

où $D$ est la durée de la journée, en heures, $L$ la latitude exprimée en degrés, et $P$ :

$$ P = \arcsin \left[ 0.39795 \times \cos\left( 0.2163108 + 2 \times \arctan\left( 0.9671396 \times \tan\left(0.00860\times(J-186)\right)\right)\right)\right] $$

avec $J$ le jour de l’année. La valeur 0.8333 peut être modifiée pour prendre en compte différentes définitions de la durée d’une journée (voir article).

Les auteurs proposent des comparaisons, et montrent que leur approche a une erreur inférieure à 1 minute pour des latitudes inférieures à 40° Nord / Sud et une erreur maximale de 7 minutes pour une latitude de 60°.

Implémentation Python

def day_length(J, L):
    """
    -----------------------------------------------------------------------------------------
    Based upon : "A model comparison for daylength as a function of latitude and day of year"
    Forsythe et al., 1995, Ecological Modelling 80 (1995) 87-95
    https://doi.org/10.1016/0304-3800(94)00034-F
    -----------------------------------------------------------------------------------------
    Parameters
    ----------
    J: int / list of int / array 
        day of the year.
    L: float 
        latitude (in °)

    Returns
    -------
    Lenght of the day(s) in hours
    
    To account for various definitions of daylength, modify the "p" value accordingly.
    * Sunrise/Sunset is when the center of the sun is even with the horizon 
    p = 0
    * Sunrise/Sunset is when the top of the sun is even with horizon
    p = 0.26667
    * Sunrise/Sunset is when the top of the sun is apparently even with horizon
    p = 0.8333 
    * Other definiton can be found in the article.

    """
    p = 0.8333
    phi = np.arcsin(
            0.39795 * ( np.cos( 0.2163108 + 2 * np.arctan( 0.9671396 * np.tan( 0.00860 * (J-186) ) ) ) )
        )
    D = 24 - (24/np.pi)*np.arccos(
              ( np.sin( p*np.pi/180 ) + np.sin( L*np.pi/180 ) * np.sin( phi ) ) / (np.cos(L*np.pi/180) * np.cos( phi ) )
        )

    return D

  1. William C. Forsythe, Edward J. Rykiel Jr., Randal S. Stahl, Hsin-i Wu, Robert M. Schoolfield, 2006, A model comparison for daylength as a function of latitude and day of year. Ecological Modelling. Lien PDF  ↩︎