#!/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/>.
#
########################################################################
"""
Bibliothèque pyspc du projet pyspc - IO - Météo-France - write
"""
import numpy as np
from pyspc.core.convention import EXTERNAL_VARNAMES
from pyspc.core.series import Series
import pyspc.core.exception as _exception
from pyspc.data.meteofrance import MF_Data
[docs]
def write_MF_Data(series=None, filename=None):
"""
Créer un fichier d'observations de Météo-France
à partir d'une instance Series
Parameters
----------
series : pyspc.core.series.Series
Collection de séries de données
filename : str
Nom du fichier d'observations de Météo-France
Returns
-------
filename : str
Nom du fichier d'observations de Météo-France
"""
# -------------------------------------------------------------------------
# 0- Contrôles
# -------------------------------------------------------------------------
_exception.check_str(filename)
_exception.raise_valueerror(
not isinstance(series, Series),
"'series' doit être une collection 'Series'"
)
# -------------------------------------------------------------------------
# 1- Manipulation de Series
# -------------------------------------------------------------------------
# Grandeur
try:
varname = [k[1]
for k, v in EXTERNAL_VARNAMES.items()
if v == series.varnames[0] and k[0] == 'MF_Data']
varname = varname[0]
dtfmt = [s.dtfmt for s in series.values()][0]
except IndexError as ie:
raise ValueError('Grandeur inconnue') from ie
# Concaténer les séries de données
df = series.concat()
# Retirer (POSTE, VAR) en trop dans columns
df.columns = [x[0] for x in df.columns]
# Inversion du pivot
df = df.stack(0).to_frame() # 0: POSTE
df.columns = [varname]
df.index.rename('DATE', level=0, inplace=True)
df.index.rename('POSTE', level=1, inplace=True)
# Pour trier par POSTE croissante puis par DATE croissante
df.sort_index(level=['POSTE', 'DATE'], inplace=True)
# Effacer l'index : ('DATE', 'POSTE') -> (0, 1, ... N)
df = df.reset_index(level=['DATE', 'POSTE'])
# Ré-arrangement des colonnes dans le bon ordre + ajout de la colonne Qxx
df = df.reindex(columns=['POSTE', 'DATE', varname, f'Q{varname}'])
# Remplir la colonne Qxxxx par 'v'
df = df.fillna(value={f'Q{varname}': 'v', varname: np.nan})
# Formater la date
df['DATE'] = df['DATE'].apply(lambda x: x.strftime(dtfmt))
# -------------------------------------------------------------------------
# 2- Ecriture du fichier
# -------------------------------------------------------------------------
writer = MF_Data(filename=filename)
writer.write(df)
return filename