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:
- Europe / France
- Scientific name: Hirundo rusticaa Linnaeus, 1758
- Year: 2000 - 2026
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)