def generacion_csv_oficial_consumo_horario(self, save_pathdir=None):
df_csv = pd.DataFrame(self._consumo_horario)<EOL>columns = '<STR_LIT>'.split('<STR_LIT:;>')<EOL>date_fmt = '<STR_LIT>'<EOL>time_fmt = '<STR_LIT>'<EOL>metodo_obt = '<STR_LIT:R>'<EOL>df_csv[columns[<NUM_LIT:0>]] = self._cups<EOL>df_csv[columns[<NUM_LIT:1>]] = [date_fmt.format(x) for x in df_csv.index]<EOL>df_csv[columns[<NUM_LIT:2>]] = [int(time_fmt.format(x)) + <NUM_LIT:1> for x in df_csv.index]<EOL>df_csv[columns[<NUM_LIT:3>]] = df_csv[self._consumo_horario.name].round(<NUM_LIT:3>)<EOL>df_csv[columns[<NUM_LIT:4>]] = metodo_obt<EOL>df_csv.drop(self._consumo_horario.name, axis=<NUM_LIT:1>, inplace=True)<EOL>if save_pathdir is not None:  <EOL><INDENT>params_csv = dict(index=False, sep='<STR_LIT:;>', decimal='<STR_LIT:U+002C>', float_format='<STR_LIT>')<EOL>path_csv = os.path.join(os.path.expanduser(save_pathdir),<EOL>'<STR_LIT>'.format(pd.Timestamp(self._t0), self._tf))<EOL>df_csv.to_csv(path_csv, **params_csv)<EOL><DEDENT>return df_csv<EOL>
Genera o graba el consumo horario en CSV, con el formato utilizado por las distribuidoras (oficial de facto),
para su importación en otras herramientas, como la existente en: https://facturaluz2.cnmc.es/facturaluz2.html

El formato es el siguiente:
```
    CUPS;Fecha;Hora;Consumo_kWh;Metodo_obtencion
    ES00XXXXXXXXXXXXXXDB;06/09/2015;1;0,267;R
    ES00XXXXXXXXXXXXXXDB;06/09/2015;2;0,143;R
    ES00XXXXXXXXXXXXXXDB;06/09/2015;3;0,118;R
    ...
```
:param save_pathdir: (OPC) path_str de destino para grabar el CSV.
:return: dataframe de consumo con 'formato oficial'
:rtype: pd.dataframe