Code source de pyspc.metadata.hydro2.stat

#!/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/>.
#
########################################################################
"""
Méta-données (statistiques, synthèse) - Hydro2
"""
from pyspc.convention.hydro2 import (
    DATATYPES, TR,
    LINECONTENTS, SEP, LINESTOSKIP, PAIRVALUES
)


def _process_946(x):
    """Traiter la ligne 946"""
    d = {}
    values = x[9:]
    if (len(values) - 1 - 4) % 6 != 0:
        return d
    itr = (len(values) - 1 - 4) // 6
    subtr = TR[:itr]
    c = 9
    for v in ['QJ', 'QIX']:
        # Gumbel
        for s in ['x0', 'gradex']:
            k = f'QC_{v}_{s}'
            d[k] = x[c]
            c += 1
        # Temps de retour
        for t in TR:
            for s in ['', 'inf', 'sup']:
                k = f'QC_{v}_{t}{s}'
                try:
                    subtr.index(t)
                except ValueError:
                    d[k] = ''
                else:
                    d[k] = x[c]
                    c += 1
    return d


[docs] class Hydro2(): """ Structure de statistiques HYDRO-2 Attributes ---------- filename : str Nom du fichier Hydro2 """
[docs] def __init__(self, filename=None): """ Initialisation de l'instance de la classe Hydro2 Parameters ---------- filename : str Nom du fichier Hydro2 """ self.filename = filename
def __str__(self): """ Afficher les méta-données de l'instance Hydro2 """ text = """ ************************************* ******** HYDRO2 - Statistics ******** ************************************* * NOM FICHIER = {filename} ************************************* """ return text.format(filename=self.filename)
[docs] def read(self): """ Lecture du fichier d'export statistiques HYDRO-2 Returns ------- info : dict Dictionnaire des informations par station: - clé : station - valeur : dictionnaire des statistiques de la station Examples -------- >>> from pyspc.metadata.hydro2 import Hydro2 Cas avec un fichier DEBCLA >>> f = 'data/metadata/hydro2/debcla1.txt' >>> d = 'DEBCLA' >>> reader = Hydro2_Stat(filename=f, datatype=d) >>> content = reader.read() >>> content { 'K1251810': { 'area': '776.000', 'end': '31-08-2020', 'name': "L'Arroux à Dracy-Saint-Loup [Surmoulin]", 'provider': 'DREAL Bourgogne', 'start': '01-09-1948', 'station': 'K1251810', 'z0': '291.000', '0.0000': '0.020', '0.0010': '0.045', ''*****': '*****', '0.9980': '88.300', '0.9990': '100.000', '1.0000': '156.000', }, 'K1321810': { 'area': '1800.000', 'end': '31-08-2020', 'name': "L'Arroux à Étang-sur-Arroux [Pont du Tacot]", 'provider': 'DREAL Centre', 'start': '01-09-1948', 'station': 'K1321810', 'z0': '273.000', '0.0000': '0.147', '0.0010': '0.211', ''*****': '*****', '0.9980': '233.000', '0.9990': '262.000', '1.0000': '408.000', }, 'K1341810': { 'area': '2280.000', 'end': '31-08-2020', 'name': "L'Arroux à Rigny-sur-Arroux", 'provider': 'DREAL Centre', 'start': '01-09-1948', 'station': 'K1341810', 'z0': '237.000', '0.0000': '0.100', '0.0010': '0.286', ''*****': '*****', '0.9980': '264.000', '0.9990': '296.000', '1.0000': '391.000', } } Cas avec un fichier CRUCAL >>> f = 'data/metadata/hydro2/crucal1.txt' >>> d = 'DEBCLA' >>> reader = Hydro2_Stat(filename=f, datatype=d) >>> content = reader.read() >>> content { 'K1251810': { 'area': '776.000', 'end': '31-082020', 'law': 'GUMBEL', 'name': "L'Arroux à Dracy-Saint-Loup [Surmoulin]", 'provider': 'DREAL Bourgogne', 'start': '01-091948', 'station': 'K1251810', 'units': 'm3/s', 'var': 'QIX', 'z0': '291.000', '2': '110.000-98.000-120.000', '5': '150.000-140.000-180.000', '10': '190.000-170.000-220.000', '20': '210.000-190.000-260.000', '50': '250.000-220.000-310.000', '19850123': '104.000', ''*****': '*****', '20200306': '122.000', }, 'K1321810': { 'area': '1800.000', 'end': '31-082020', 'law': 'GUMBEL', 'name': "L'Arroux à Étang-sur-Arroux [Pont du Tacot]", 'provider': 'DREAL Centre', 'start': '01-091948', 'station': 'K1321810', 'units': 'm3/s', 'var': 'QIX', 'z0': '273.000', '2': '230.000-210.000-250.000', '5': '320.000-290.000-360.000', '10': '380.000-340.000-440.000', '20': '430.000-390.000-510.000', '50': '500.000-450.000-600.000', '19730214': '108.000', ''*****': '*****', '20200306': '255.000', }, 'K1341810': { 'area': '2280.000', 'end': '31-082020', 'law': 'GUMBEL', 'name': "L'Arroux à Rigny-sur-Arroux", 'provider': 'DREAL Centre', 'start': '01-091948', 'station': 'K1341810', 'units': 'm3/s', 'var': 'QIX', 'z0': '237.000', '2': '230.000-220.000-250.000', '10': '370.000-340.000-410.000', '20': '420.000-380.000-480.000', '5': '320.000-290.000-350.000', '50': '490.000-440.000-560.000', '19681201': '253.000', ''*****': '*****', '20200307': '244.000', } } Cas avec un fichier SYNTHESE >>> f = 'data/metadata/hydro2/synth1.txt' >>> d = 'SYNTHESE' >>> reader = Hydro2_Stat(filename=f, datatype=d) >>> content = reader.read() >>> content { 'K1251810': { 'DC_01': '0.101', ''*****': '*****', 'QC_QIX_10': '190.000', 'QC_QIX_100': '', 'QC_QIX_100inf': '', 'QC_QIX_100sup': '', 'QC_QIX_10inf': '170.000', 'QC_QIX_10sup': '220.000', 'QC_QIX_2': '110.000', 'QC_QIX_20': '210.000', 'QC_QIX_20inf': '190.000', 'QC_QIX_20sup': '260.000', 'QC_QIX_2inf': '98.000', 'QC_QIX_2sup': '120.000', 'QC_QIX_5': '150.000', 'QC_QIX_50': '250.000', 'QC_QIX_50inf': '220.000', 'QC_QIX_50sup': '310.000', 'QC_QIX_5inf': '140.000', 'QC_QIX_5sup': '180.000', 'QC_QIX_gradex': '40.800', 'QC_QIX_x0': '93.400', ''*****': '*****', 'QspMM_nb': '37', 'area': '776.000', 'name': "L'Arroux à Dracy-Saint-Loup [Surmoulin]", 'provider': 'DREAL Bourgogne', 'station': 'K1251810', 'z0': '291.000' }, 'K1321810': { 'DC_01': '0.630', ''*****': '*****', 'QC_QIX_10': '380.000', 'QC_QIX_100': '', 'QC_QIX_100inf': '', 'QC_QIX_100sup': '', 'QC_QIX_10inf': '340.000', 'QC_QIX_10sup': '440.000', 'QC_QIX_2': '230.000', 'QC_QIX_20': '430.000', 'QC_QIX_20inf': '390.000', 'QC_QIX_20sup': '510.000', 'QC_QIX_2inf': '210.000', 'QC_QIX_2sup': '250.000', 'QC_QIX_5': '320.000', 'QC_QIX_50': '500.000', 'QC_QIX_50inf': '450.000', 'QC_QIX_50sup': '600.000', 'QC_QIX_5inf': '290.000', 'QC_QIX_5sup': '360.000', 'QC_QIX_gradex': '77.600', 'QC_QIX_x0': '201.000', ''*****': '*****', 'QspMM_AA': '12.3', 'QspMM_nb': '50', 'area': '1800.000', 'name': "L'Arroux à Étang-sur-Arroux [Pont du Tacot]", 'provider': 'DREAL Centre', 'station': 'K1321810', 'z0': '273.000' }, 'K1341810': { 'DC_01': '0.602', ''*****': '*****', 'QC_QIX_10': '370.000', 'QC_QIX_100': '', 'QC_QIX_100inf': '', 'QC_QIX_100sup': '', 'QC_QIX_10inf': '340.000', 'QC_QIX_10sup': '410.000', 'QC_QIX_2': '230.000', 'QC_QIX_20': '420.000', 'QC_QIX_20inf': '380.000', 'QC_QIX_20sup': '480.000', 'QC_QIX_2inf': '220.000', 'QC_QIX_2sup': '250.000', 'QC_QIX_5': '320.000', 'QC_QIX_50': '490.000', 'QC_QIX_50inf': '440.000', 'QC_QIX_50sup': '560.000', 'QC_QIX_5inf': '290.000', 'QC_QIX_5sup': '350.000', 'QC_QIX_gradex': '71.100', 'QC_QIX_x0': '208.000', ''*****': '*****', 'QspMM_AA': '11.9', 'QspMM_nb': '54', 'area': '2280.000', 'name': "L'Arroux à Rigny-sur-Arroux", 'provider': 'DREAL Centre', 'station': 'K1341810', 'z0': '237.000' } } """ info = {} with open(self.filename, 'r', encoding='cp1252') as f: for line in f.readlines(): x = line.split(';') # Lignes à ignorer if x[0] in LINESTOSKIP: continue # Décomposition de la ligne sous forme de dictionnaire try: meta = {k: SEP[x[0]].join([x[i] for i in v]) for k, v in LINECONTENTS[x[0]].items()} except KeyError: continue # Décomposition de la ligne sous forme de paires # clé: valeur try: ik = SEP[x[0]].join([x[i] for i in PAIRVALUES[x[0]][0]]) iv = SEP[x[0]].join([x[i] for i in PAIRVALUES[x[0]][1]]) meta2 = {ik: iv} except KeyError: pass else: meta.update(meta2) # Spécificité de la ligne 925 (SYNTHESE) if x[0] == '925' and len(x) != 21: meta['MX_HIX'] = '' meta['MX_HIXdt'] = '' # Spécificité de la ligne 946 (SYNTHESE) elif x[0] == '946': meta.update(_process_946(x)) # Mise-à-jour des statistiques de la station s = meta['station'] info.setdefault(s, {}) info[s].update(meta) return info
[docs] def write(self): """ Ecrire le fichier d'export statistiques HYDRO-2 Raises ------ NotImplementedError """ raise NotImplementedError
[docs] @classmethod def get_datatypes(cls): """ Définir le type de procédure d'export statistique Hydro-2 Returns ------- list Liste des procédures d'export statistique Hydro-2 """ return sorted(DATATYPES['metadata'])