Pandas
Pandas permet de travailler facilement avec certains types de données:
données tabulaires. ex : table SQL ou feuille Excel.
séries temporelles
et d’autres …
Les données peuvent être chargées depuis différentes sources (csv, excel, sql, …) et sont exposées principalement par deux structures de données : Series
(1D) et DataFrame
(2D).
Pandas apporte en particulier une réponse pour:
la gestion des dates
la gestion des données manquantes
note: les données utilisées sont issues de https://public.opendatasoft.com/explore/dataset/donnees-synop-essentielles-omm
[1]:
import pandas as pd
import matplotlib
[2]:
df = pd.read_csv("donnees-synop-essentielles-omm.csv", sep=';')
df.Date = pd.to_datetime(df.Date, utc=True)
df.head(5)
[2]:
ID OMM station | Date | Pression au niveau mer | Variation de pression en 3 heures | Type de tendance barométrique | Direction du vent moyen 10 mn | Vitesse du vent moyen 10 mn | Température | Point de rosée | Humidité | ... | Type nuage 3 | Hauteur de base 3 | Nébulosité couche nuageuse 4 | Type nuage 4 | Hauteur de base 4 | Coordonnees | Nom | Type de tendance barométrique.1 | Temps passé 1.1 | Temps présent.1 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 7240 | 2018-08-08 15:00:00+00:00 | 101380 | -130.0 | 7.0 | 250.0 | 4.0 | 298.65 | 285.45 | 44 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 7.0 | NaN | 0 |
1 | 7240 | 2018-08-09 18:00:00+00:00 | 102000 | 200.0 | 2.0 | 250.0 | 2.9 | 289.45 | 286.75 | 84 | ... | NaN | 2940.0 | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 2.0 | NaN | 0 |
2 | 7240 | 2018-08-10 06:00:00+00:00 | 102500 | 120.0 | 3.0 | 250.0 | 2.3 | 285.85 | 284.25 | 90 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 3.0 | NaN | 0 |
3 | 7240 | 2018-08-15 15:00:00+00:00 | 102030 | -150.0 | 8.0 | 320.0 | 2.1 | 298.05 | 285.95 | 47 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 8.0 | NaN | 0 |
4 | 7240 | 2018-08-18 03:00:00+00:00 | 102440 | 10.0 | 0.0 | 330.0 | 0.7 | 285.65 | 283.15 | 85 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 0.0 | NaN | 0 |
5 rows × 64 columns
[3]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 26071 entries, 0 to 26070
Data columns (total 64 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 ID OMM station 26071 non-null int64
1 Date 26071 non-null datetime64[ns, UTC]
2 Pression au niveau mer 26071 non-null int64
3 Variation de pression en 3 heures 26062 non-null float64
4 Type de tendance barométrique 26062 non-null float64
5 Direction du vent moyen 10 mn 26036 non-null float64
6 Vitesse du vent moyen 10 mn 26037 non-null float64
7 Température 26071 non-null float64
8 Point de rosée 26071 non-null float64
9 Humidité 26071 non-null int64
10 Visibilité horizontale 26069 non-null float64
11 Temps présent 25999 non-null object
12 Temps passé 1 7958 non-null object
13 Temps passé 2 7114 non-null float64
14 Nebulosité totale 19664 non-null float64
15 Nébulosité des nuages de l' étage inférieur 18503 non-null float64
16 Hauteur de la base des nuages de l'étage inférieur 18511 non-null float64
17 Type des nuages de l'étage inférieur 9864 non-null float64
18 Type des nuages de l'étage moyen 8899 non-null float64
19 Type des nuages de l'étage supérieur 8655 non-null float64
20 Pression station 26071 non-null int64
21 Niveau barométrique 0 non-null float64
22 Géopotentiel 0 non-null float64
23 Variation de pression en 24 heures 11702 non-null float64
24 Température minimale sur 12 heures 6514 non-null float64
25 Température minimale sur 24 heures 0 non-null float64
26 Température maximale sur 12 heures 6514 non-null float64
27 Température maximale sur 24 heures 0 non-null float64
28 Température minimale du sol sur 12 heures 13485 non-null float64
29 Méthode de mesure Température du thermomètre mouillé 0 non-null float64
30 Température du thermomètre mouillé 0 non-null float64
31 Rafale sur les 10 dernières minutes 11840 non-null float64
32 Rafales sur une période 26007 non-null float64
33 Periode de mesure de la rafale 26051 non-null float64
34 Etat du sol 12572 non-null float64
35 Hauteur totale de la couche de neige, glace, autre au sol 15887 non-null float64
36 Hauteur de la neige fraîche 10499 non-null float64
37 Periode de mesure de la neige fraiche 9543 non-null float64
38 Précipitations dans la dernière heure 26007 non-null float64
39 Précipitations dans les 3 dernières heures 26013 non-null float64
40 Précipitations dans les 6 dernières heures 15246 non-null float64
41 Précipitations dans les 12 dernières heures 15154 non-null float64
42 Précipitations dans les 24 dernières heures 13254 non-null float64
43 Phénomène spécial 1 14283 non-null float64
44 Phénomène spécial 2 14273 non-null float64
45 Phénomène spécial 3 8318 non-null float64
46 Phénomène spécial 4 61 non-null float64
47 Nébulosité couche nuageuse 1 15269 non-null float64
48 Type nuage 1 9358 non-null float64
49 Hauteur de base 1 14635 non-null float64
50 Nébulosité couche nuageuse 2 6281 non-null float64
51 Type nuage 2 3490 non-null float64
52 Hauteur de base 2 6138 non-null float64
53 Nébulosité couche nuageuse 3 1622 non-null float64
54 Type nuage 3 516 non-null float64
55 Hauteur de base 3 1622 non-null float64
56 Nébulosité couche nuageuse 4 2 non-null float64
57 Type nuage 4 203 non-null float64
58 Hauteur de base 4 2 non-null float64
59 Coordonnees 26071 non-null object
60 Nom 26071 non-null object
61 Type de tendance barométrique.1 26062 non-null float64
62 Temps passé 1.1 7958 non-null object
63 Temps présent.1 25999 non-null object
dtypes: datetime64[ns, UTC](1), float64(53), int64(4), object(6)
memory usage: 12.7+ MB
[4]:
df.describe()
[4]:
ID OMM station | Pression au niveau mer | Variation de pression en 3 heures | Type de tendance barométrique | Direction du vent moyen 10 mn | Vitesse du vent moyen 10 mn | Température | Point de rosée | Humidité | Visibilité horizontale | ... | Nébulosité couche nuageuse 2 | Type nuage 2 | Hauteur de base 2 | Nébulosité couche nuageuse 3 | Type nuage 3 | Hauteur de base 3 | Nébulosité couche nuageuse 4 | Type nuage 4 | Hauteur de base 4 | Type de tendance barométrique.1 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 26071.0 | 26071.000000 | 26062.000000 | 26062.000000 | 26036.000000 | 26037.000000 | 26071.000000 | 26071.000000 | 26071.000000 | 26069.000000 | ... | 6281.000000 | 3490.000000 | 6138.000000 | 1622.000000 | 516.000000 | 1622.000000 | 2.0 | 203.000000 | 2.000000 | 26062.000000 |
mean | 7240.0 | 101727.889226 | 0.034533 | 4.338654 | 183.604624 | 3.326124 | 285.248964 | 280.782876 | 76.787657 | 26243.515670 | ... | 6.078013 | 4.205731 | 2605.171065 | 6.835388 | 4.695736 | 2666.134402 | 6.0 | 8.216749 | 4350.000000 | 4.338654 |
std | 0.0 | 892.362431 | 121.018307 | 2.697870 | 105.004084 | 1.848995 | 7.135546 | 5.411169 | 17.055975 | 17644.988344 | ... | 1.695055 | 2.609169 | 2263.468510 | 1.210954 | 3.110655 | 2028.994254 | 0.0 | 0.821924 | 2333.452378 | 2.697870 |
min | 7240.0 | 97010.000000 | -940.000000 | 0.000000 | 0.000000 | 0.000000 | 261.850000 | 258.150000 | 17.000000 | 30.000000 | ... | 1.000000 | 0.000000 | 180.000000 | 1.000000 | 0.000000 | 360.000000 | 6.0 | 0.000000 | 2700.000000 | 0.000000 |
25% | 7240.0 | 101230.000000 | -70.000000 | 2.000000 | 80.000000 | 2.100000 | 280.150000 | 277.050000 | 66.000000 | 12000.000000 | ... | 5.000000 | 3.000000 | 990.000000 | 6.000000 | 3.000000 | 1230.000000 | 6.0 | 8.000000 | 3525.000000 | 2.000000 |
50% | 7240.0 | 101770.000000 | 0.000000 | 4.000000 | 200.000000 | 3.100000 | 284.950000 | 281.150000 | 81.000000 | 24000.000000 | ... | 7.000000 | 6.000000 | 1680.000000 | 7.000000 | 6.000000 | 1800.000000 | 6.0 | 8.000000 | 4350.000000 | 4.000000 |
75% | 7240.0 | 102300.000000 | 70.000000 | 7.000000 | 270.000000 | 4.500000 | 290.050000 | 284.850000 | 91.000000 | 35870.000000 | ... | 7.000000 | 6.000000 | 3480.000000 | 8.000000 | 8.000000 | 3300.000000 | 6.0 | 9.000000 | 5175.000000 | 7.000000 |
max | 7240.0 | 104290.000000 | 1200.000000 | 8.000000 | 360.000000 | 17.500000 | 309.850000 | 294.450000 | 100.000000 | 75000.000000 | ... | 8.000000 | 9.000000 | 8000.000000 | 8.000000 | 9.000000 | 8000.000000 | 6.0 | 9.000000 | 6000.000000 | 8.000000 |
8 rows × 57 columns
[5]:
df.shape
[5]:
(26071, 64)
[6]:
df[50:53]
[6]:
ID OMM station | Date | Pression au niveau mer | Variation de pression en 3 heures | Type de tendance barométrique | Direction du vent moyen 10 mn | Vitesse du vent moyen 10 mn | Température | Point de rosée | Humidité | ... | Type nuage 3 | Hauteur de base 3 | Nébulosité couche nuageuse 4 | Type nuage 4 | Hauteur de base 4 | Coordonnees | Nom | Type de tendance barométrique.1 | Temps passé 1.1 | Temps présent.1 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
50 | 7240 | 2012-04-06 15:00:00+00:00 | 100910 | -200.0 | 8.0 | 10.0 | 4.6 | 287.25 | 279.85 | 61 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 8.0 | NaN | 10 |
51 | 7240 | 2012-04-13 03:00:00+00:00 | 100610 | -50.0 | 6.0 | 270.0 | 1.5 | 276.75 | 274.65 | 86 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 6.0 | NaN | 1 |
52 | 7240 | 2012-09-11 21:00:00+00:00 | 101950 | 170.0 | 1.0 | 320.0 | 2.6 | 287.65 | 282.05 | 69 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 1.0 | Nuages couvrant plus de la moitié du ciel pend... | 2 |
3 rows × 64 columns
[7]:
df.columns
[7]:
Index(['ID OMM station', 'Date', 'Pression au niveau mer',
'Variation de pression en 3 heures', 'Type de tendance barométrique',
'Direction du vent moyen 10 mn', 'Vitesse du vent moyen 10 mn',
'Température', 'Point de rosée', 'Humidité', 'Visibilité horizontale',
'Temps présent', 'Temps passé 1', 'Temps passé 2', 'Nebulosité totale',
'Nébulosité des nuages de l' étage inférieur',
'Hauteur de la base des nuages de l'étage inférieur',
'Type des nuages de l'étage inférieur',
'Type des nuages de l'étage moyen',
'Type des nuages de l'étage supérieur', 'Pression station',
'Niveau barométrique', 'Géopotentiel',
'Variation de pression en 24 heures',
'Température minimale sur 12 heures',
'Température minimale sur 24 heures',
'Température maximale sur 12 heures',
'Température maximale sur 24 heures',
'Température minimale du sol sur 12 heures',
'Méthode de mesure Température du thermomètre mouillé',
'Température du thermomètre mouillé',
'Rafale sur les 10 dernières minutes', 'Rafales sur une période',
'Periode de mesure de la rafale', 'Etat du sol',
'Hauteur totale de la couche de neige, glace, autre au sol',
'Hauteur de la neige fraîche', 'Periode de mesure de la neige fraiche',
'Précipitations dans la dernière heure',
'Précipitations dans les 3 dernières heures',
'Précipitations dans les 6 dernières heures',
'Précipitations dans les 12 dernières heures',
'Précipitations dans les 24 dernières heures', 'Phénomène spécial 1',
'Phénomène spécial 2', 'Phénomène spécial 3', 'Phénomène spécial 4',
'Nébulosité couche nuageuse 1', 'Type nuage 1', 'Hauteur de base 1',
'Nébulosité couche nuageuse 2', 'Type nuage 2', 'Hauteur de base 2',
'Nébulosité couche nuageuse 3', 'Type nuage 3', 'Hauteur de base 3',
'Nébulosité couche nuageuse 4', 'Type nuage 4', 'Hauteur de base 4',
'Coordonnees', 'Nom', 'Type de tendance barométrique.1',
'Temps passé 1.1', 'Temps présent.1'],
dtype='object')
[8]:
df["Date"]
[8]:
0 2018-08-08 15:00:00+00:00
1 2018-08-09 18:00:00+00:00
2 2018-08-10 06:00:00+00:00
3 2018-08-15 15:00:00+00:00
4 2018-08-18 03:00:00+00:00
...
26066 2018-09-08 03:00:00+00:00
26067 2018-12-12 03:00:00+00:00
26068 2018-12-05 15:00:00+00:00
26069 2018-12-04 00:00:00+00:00
26070 2018-11-29 12:00:00+00:00
Name: Date, Length: 26071, dtype: datetime64[ns, UTC]
[9]:
df["Date"].max()
[9]:
Timestamp('2019-01-30 21:00:00+0000', tz='UTC')
[10]:
df["Date"].min()
[10]:
Timestamp('2010-01-01 00:00:00+0000', tz='UTC')
[11]:
df[["Date", "Température"]].head()
[11]:
Date | Température | |
---|---|---|
0 | 2018-08-08 15:00:00+00:00 | 298.65 |
1 | 2018-08-09 18:00:00+00:00 | 289.45 |
2 | 2018-08-10 06:00:00+00:00 | 285.85 |
3 | 2018-08-15 15:00:00+00:00 | 298.05 |
4 | 2018-08-18 03:00:00+00:00 | 285.65 |
[12]:
df["Température"].min()
[12]:
261.85
[13]:
df["Température"] == df["Température"].min()
[13]:
0 False
1 False
2 False
3 False
4 False
...
26066 False
26067 False
26068 False
26069 False
26070 False
Name: Température, Length: 26071, dtype: bool
[14]:
df[df["Température"] == df["Température"].min()]
[14]:
ID OMM station | Date | Pression au niveau mer | Variation de pression en 3 heures | Type de tendance barométrique | Direction du vent moyen 10 mn | Vitesse du vent moyen 10 mn | Température | Point de rosée | Humidité | ... | Type nuage 3 | Hauteur de base 3 | Nébulosité couche nuageuse 4 | Type nuage 4 | Hauteur de base 4 | Coordonnees | Nom | Type de tendance barométrique.1 | Temps passé 1.1 | Temps présent.1 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
21810 | 7240 | 2012-02-09 06:00:00+00:00 | 103740 | 10.0 | 2.0 | 310.0 | 1.0 | 261.85 | 260.55 | 89 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 2.0 | NaN | 10 |
1 rows × 64 columns
[15]:
df[df["Température"] == df["Température"].max()][["Date", "Température"]]
[15]:
Date | Température | |
---|---|---|
7993 | 2016-07-19 15:00:00+00:00 | 309.85 |
[16]:
df.plot(x="Date", y="Température")
[16]:
<Axes: xlabel='Date'>

[17]:
ax = df.plot(x="Date", y="Température", linestyle="", marker=".", legend=False)
ax.set_ylabel('Température')
[17]:
Text(0, 0.5, 'Température')

[18]:
ax = df.plot(x="Humidité", y="Température", linestyle="", marker=".", legend=False)
ax.set_ylabel('Température')
[18]:
Text(0, 0.5, 'Température')

[19]:
tdf = df.set_index("Date").sort_index()
[20]:
tdf.head()
[20]:
ID OMM station | Pression au niveau mer | Variation de pression en 3 heures | Type de tendance barométrique | Direction du vent moyen 10 mn | Vitesse du vent moyen 10 mn | Température | Point de rosée | Humidité | Visibilité horizontale | ... | Type nuage 3 | Hauteur de base 3 | Nébulosité couche nuageuse 4 | Type nuage 4 | Hauteur de base 4 | Coordonnees | Nom | Type de tendance barométrique.1 | Temps passé 1.1 | Temps présent.1 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Date | |||||||||||||||||||||
2010-01-01 00:00:00+00:00 | 7240 | 99320 | 0.0 | 5.0 | 30.0 | 4.6 | 276.55 | 275.55 | 93 | 4000.0 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 5.0 | Pluie | 60 |
2010-01-01 03:00:00+00:00 | 7240 | 99400 | 70.0 | 3.0 | 20.0 | 4.6 | 274.95 | 273.95 | 93 | 2600.0 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 3.0 | NaN | 10 |
2010-01-01 06:00:00+00:00 | 7240 | 99610 | 210.0 | 3.0 | 360.0 | 5.1 | 274.05 | 272.55 | 90 | 7000.0 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 3.0 | NaN | 20 |
2010-01-01 09:00:00+00:00 | 7240 | 99950 | 330.0 | 3.0 | 360.0 | 4.6 | 273.65 | 271.75 | 87 | 6000.0 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 3.0 | NaN | 0 |
2010-01-01 12:00:00+00:00 | 7240 | 100250 | 300.0 | 2.0 | 330.0 | 5.7 | 273.65 | 270.95 | 82 | 10000.0 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 2.0 | NaN | 0 |
5 rows × 63 columns
[21]:
df.head()
[21]:
ID OMM station | Date | Pression au niveau mer | Variation de pression en 3 heures | Type de tendance barométrique | Direction du vent moyen 10 mn | Vitesse du vent moyen 10 mn | Température | Point de rosée | Humidité | ... | Type nuage 3 | Hauteur de base 3 | Nébulosité couche nuageuse 4 | Type nuage 4 | Hauteur de base 4 | Coordonnees | Nom | Type de tendance barométrique.1 | Temps passé 1.1 | Temps présent.1 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 7240 | 2018-08-08 15:00:00+00:00 | 101380 | -130.0 | 7.0 | 250.0 | 4.0 | 298.65 | 285.45 | 44 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 7.0 | NaN | 0 |
1 | 7240 | 2018-08-09 18:00:00+00:00 | 102000 | 200.0 | 2.0 | 250.0 | 2.9 | 289.45 | 286.75 | 84 | ... | NaN | 2940.0 | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 2.0 | NaN | 0 |
2 | 7240 | 2018-08-10 06:00:00+00:00 | 102500 | 120.0 | 3.0 | 250.0 | 2.3 | 285.85 | 284.25 | 90 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 3.0 | NaN | 0 |
3 | 7240 | 2018-08-15 15:00:00+00:00 | 102030 | -150.0 | 8.0 | 320.0 | 2.1 | 298.05 | 285.95 | 47 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 8.0 | NaN | 0 |
4 | 7240 | 2018-08-18 03:00:00+00:00 | 102440 | 10.0 | 0.0 | 330.0 | 0.7 | 285.65 | 283.15 | 85 | ... | NaN | NaN | NaN | NaN | NaN | 47.4445, 0.727333 | TOURS | 0.0 | NaN | 0 |
5 rows × 64 columns
[22]:
tdf.plot(y=["Température", "Humidité"])
[22]:
<Axes: xlabel='Date'>

[23]:
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
tdf.plot(y="Température", ax=ax1, legend=False, linestyle="", marker=".", color="r")
tdf.plot(y="Humidité", ax=ax2, legend=False, linestyle="", marker=".", color="b")
[23]:
<Axes: xlabel='Date'>

[24]:
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
tdf['2010':'2011'].plot(y="Température", ax=ax1, legend=False, linestyle="", marker=".", color="r")
tdf['2010':'2011'].plot(y="Humidité", ax=ax2, legend=False, linestyle="", marker=".", color="b")
[24]:
<Axes: xlabel='Date'>

[25]:
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
rtdf = tdf[["Température", "Humidité"]].rolling("30d").median()
rtdf.plot(y="Température", ax=ax1, legend=False, color="r")
rtdf.plot(y="Humidité", ax=ax2, legend=False, color="b")
[25]:
<Axes: xlabel='Date'>
