Le blog d'un Geekus biologicus juvénile

Phénologie des observations d'hirondelle rustique en France

Un peu de contexte

Avec le changement climatique, les plantes profittent des douceurs de début de printemps, les fleurs sont plus précoces, les populations d’insectes sont plus précoces; et certaines espèces d’oiseaux ont semble t’il déjà commencé à modifier leur habitudes migratoires et arrivent plus tôt sous nos latitudes. <citation needed>

Nous allons tenter dans ce billet de blog, d’explorer les données d’observation de l’avifaune de Faune-France pour tenter d’en extraire des tendances pour quelques espèces communes.

Source des données

GBIF.org (28 February 2026) GBIF Occurrence Download https://doi.org/10.15468/dl.y4jbx8

Filtres utilisés sur GBIF lors de la génération du jeu de données:

Phénologie des observations d’hirondelles rustiques

L’hirondelle rustique, Hirundo rustica est une des deux espèces d’hirondelle les plus communes en France avec l’hirondelle de fenêtre. On dit certe qu’ « une hirondelle ne fait pas le printemps », et en effet il y a des observations d’hirondelles ponctuelles et plus précoces qui ne sont pas forcément représentatives de la population d’hirondelles en générale, et potentiellement assez variable d’une année sur l’autre. Aussi, nous allons commencer par représenter la distribution des observations d’hirondelles, et non pas seulement la date de la première observation d’hirondelle de l’année.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv("./data/0004041-260226173443078.csv", sep="\t")
df.shape[0]
527022
df_hrustica = df[df["species"] == "Hirundo rustica"]
df_hrustica.shape[0]
527022

On a bien uniquement des observations d’hirondelle rustique.

Ajoutons une colonne avec la date de l’observation dans un format utilisable par matplotlib.

df_hrustica["datetime"] = pd.to_datetime(df_hrustica[["year", "month", "day"]])

Premier plot, avec les observations de 2020:

df_hrustica_2020 = df_hrustica[df_hrustica["year"] == 2020]
df_hrustica_2020.shape[0]
59801
import matplotlib.dates as mdates
fig, ax = plt.subplots()
matplotlib.rc('text', usetex = True)
data = df_hrustica_2020["datetime"]

ax.hist(data, bins=15)
ax.set_title(r"Phénologie des observations d'\textit{Hirundo rustica} en France en 2020")
ax.set_xlabel("Month")
ax.set_ylabel("Observations")
ax.xaxis.set_major_formatter(mdates.DateFormatter("%b"))
fig
import matplotlib.dates as mdates
import os

def plot_phenology_to_file(df: pd.DataFrame, year: int):
    fig, ax = plt.subplots()
    matplotlib.rc('text', usetex = True)
    df = df[df["year"] == year]
    data = df["datetime"]

    ax.hist(data, bins=10)
    ax.set_title(fr"Phénologie des observations d'\textit{{Hirundo rustica}} en France en {year}")
    ax.set_xlabel("Month")
    ax.set_ylabel("Observations")
    ax.xaxis.set_major_formatter(mdates.DateFormatter("%b"))
    ax.set_xlim(pd.Timestamp(f'{year}-01-01'), pd.Timestamp(f'{year}-12-31'))
    plt.savefig(f"plots/phenology_hirundo_rustica_{year}.png")


for year in range(2000, 2025+1):
    plot_phenology_to_file(df_hrustica, year)