#!/usr/bin/python3
# -*- coding: utf-8 -*-
########################################################################
#
# This file is part of python module <pyspc>.
# Copyright (C) 2013-2021 R. Marty
# (renaud.marty@developpement-durable.gouv.fr)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program (see COPYING.txt).
# If not, see <http://www.gnu.org/licenses/>.
#
########################################################################
"""
Données d'observation et de prévision - Météo-France - OPEN DATA
"""
from datetime import datetime as dt
import os.path
import pandas as pnd
from pyspc.convention.meteofrance import API_PREFIX
[docs]
class MF_OpenAPI():
"""
Lecteur des données de l'API de Météo-France.
Attributes
----------
filename : str
Fichier de données.
prefix : str
Préfixe du fichier de données.
timestep : datetime.timedelta
Pas de temps des données.
code : str
Identifiant de la station de mesure.
start : str
Premier instant.
end : str
Dernier instant.
"""
[docs]
def __init__(self, filename=None):
"""
Instanciation du lecteur du fichier METEO.DATA.GOUV.FR
Parameters
----------
filename : str
Fichier de données
Examples
--------
>>> from pyspc.data.meteofrance import MF_OpenAPI
>>> f = '43091005_Q_202410150000_202410190000.csv'
>>> reader = MF_OpenAPI(filename=f)
>>> reader
*******************************************
*********** MF - OPEN API *****************
*******************************************
* NOM FICHIER = 43091005_Q_202410150000_202410190000.csv
* PREFIXE = Q
* PAS DE TEMPS = 1 day, 0:00:00
* STATION = 43091005
* DEBUT = 2024-10-15 00:00:00
* FIN = 2024-10-19 00:00:00
*************************************
"""
self.filename = filename
info = self.split_basename(self.filename)
self.code = info[0]
self.prefix = info[1]
self.timestep = info[2]
self.start = info[3]
self.end = info[4]
def __str__(self):
"""
Afficher les méta-données de l'instance.
"""
text = """
*******************************************
*********** MF - OPEN API *****************
*******************************************
* NOM FICHIER = {filename}
* PREFIXE = {prefix}
* PAS DE TEMPS = {timestep}
* STATION = {code}
* DEBUT = {start}
* FIN = {end}
*************************************
"""
return text.format(**vars(self))
[docs]
def read(self):
"""
Lecture du fichier de données.
Returns
-------
pandas.DataFrame
Tableau des données
Examples
--------
>>> from pyspc.data.meteofrance import MF_OpenAPI
>>> f = '43091005_Q_202410150000_202410190000.csv'
>>> reader = MF_OpenAPI(filename=f)
>>> content = reader.read()
>>> content
POSTE DATE RR TN HTN TX HTX TM TMNX DG TAMPLI TNTXM ETPGRILLE
0 43091005 2024-10-15 38,6 12,4 1855 18,0 1156 14,1 15,20 0 5,6 15,2 1,9
1 43091005 2024-10-16 189,0 11,5 217 13,3 1411 12,4 12,40 0 1,8 12,4 0,1
2 43091005 2024-10-17 130,4 9,8 757 13,0 1302 11,5 11,40 0 3,2 11,4 0,1
3 43091005 2024-10-18 2,4 5,3 644 10,7 1207 8,2 8,00 0 5,4 8,0 0,4
4 43091005 2024-10-19 0,0 7,2 618 13,6 1416 9,0 10,40 0 6,4 10,4 1,1
"""
converters = {'POSTE': lambda x: str(x).strip(), 'DATE': str}
date_parser = str
if self.prefix == 'MN':
date_parser = _date_parser_MN
elif self.prefix == 'H':
date_parser = _date_parser_H
elif self.prefix == 'Q':
date_parser = _date_parser_Q
df = pnd.read_csv(self.filename, sep=';', header=0, index_col=0,
decimal=',', converters=converters)
df = df.dropna(axis=1, how='all')
df['DATE'] = df['DATE'].apply(date_parser)
return df
[docs]
@staticmethod
def split_basename(filename=None):
"""
Extraire les informations depuis le nom du fichier.
Parameters
----------
filename : str
Fichier de données.
Returns
-------
prefix : str
Préfixe du fichier de données.
timestep : datetime.timedelta
Pas de temps des données.
code : str
Identifiant de la station de mesure.
start : str
Premier instant.
end : str
Dernier instant.
Examples
--------
>>> from pyspc.data.meteofrance import MF_OpenAPI
>>> f = '43091005_Q_202410150000_202410190000.csv'
>>> reader = MF_OpenAPI.split_basename(filename=f)
>>> [code, prefix, timestep, start, end] = \
... MF_OpenData.split_basename(filename=f)
>>> code
43091005
>>> prefix
Q
>>> timestep
datetime.timedelta(days=1)
>>> start
datetime.datetime(2024, 10, 15)
>>> end
datetime.datetime(2024, 10, 19)
"""
inv_api_prefix = {v: k for k, v in API_PREFIX.items()}
if filename is None:
return None, None, None, None, None
basename = os.path.splitext(os.path.basename(filename))[0]
try:
info = basename.split('_')
code = info.pop(0)
prefix = info.pop(0)
start = dt.strptime(info.pop(0), "%Y%m%d%H%M")
end = dt.strptime(info.pop(0), "%Y%m%d%H%M")
timestep = inv_api_prefix[prefix]
except (IndexError, ValueError) as ive:
raise ValueError("Nommage incorrect.") from ive
except KeyError as ke:
raise ValueError(f"Le préfixe '{prefix}' est inconnu") from ke
return code, prefix, timestep, start, end
def _date_parser_MN(x):
""""""
try:
return dt.strptime(x, '%Y%m%d%H%M')
except ValueError:
return x
def _date_parser_H(x):
""""""
try:
return dt.strptime(x, '%Y%m%d%H')
except ValueError:
return x
def _date_parser_Q(x):
""""""
try:
return dt.strptime(x, '%Y%m%d')
except ValueError:
return x