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

Lors d’un développement récent sur des analyses des 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] $$

avec $D$ the durée de la journée, en heures, $L$ la latitude exprimée en degrés, $J$ le jour de l’année 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] $$

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
    -----------------------------------------------------------------------------------------
    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

    """
    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  ↩︎