IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Extraire serie temporelle fichier netcdf dans un .csv


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Scientifique
    Inscrit en
    Février 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Scientifique

    Informations forums :
    Inscription : Février 2017
    Messages : 11
    Par défaut Extraire serie temporelle fichier netcdf dans un .csv
    Bonjour à tous,
    Je début avec python et j'espère trouver des conseils sur ce forum.
    Je souhaite extraire les températures d'un fichier netcdf pour construire un tableau simple et l'écrire dans un fichier .csv.
    Pour cela j'utilise les modules netCDF4, numpy et pandas.
    Le script fonctionne bien (je le copie ci-dessous avec les sorties print également), mais j'ai à la fin une erreur que je n'arrive pas à résoudre pour le moment et ce malgré mes recherches.

    l'erreur est la suivante : IndexError: index 18224 is out of bounds for axis 1 with size 1, elle survient après que l'implémente une petite boucle en fin de script.

    J'espère trouver de l'aide/des conseils ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
     
    Extraire serie temporelle dun fichier netcdf dans un .csv
     
    ##Modules a importer
    import netCDF4
    from netCDF4 import Dataset
    import numpy as np
    import pandas as pd
     
    ##Lire le fichier netcdf
    data = Dataset(r'/gpfs/home/UDCPP/barrier_c/Test_NCO/temp_Corse_10m_201704.nc', 'r')
     
     
    ##Extraire lon et lat
     
    lat = data.variables['latitude'][:]
    >>> print(lat)
    [[41.123375  41.123375  41.123375  ... 41.123375  41.123375  41.123375 ]
     [41.1341975 41.1341975 41.1341975 ... 41.1341975 41.1341975 41.1341975]
     [41.14502   41.14502   41.14502   ... 41.14502   41.14502   41.14502  ]
     ...
     [43.26623   43.26623   43.26623   ... 43.26623   43.26623   43.26623  ]
     [43.2770525 43.2770525 43.2770525 ... 43.2770525 43.2770525 43.2770525]
     [43.287875  43.287875  43.287875  ... 43.287875  43.287875  43.287875 ]]
     
    lon = data.variables['longitude'][:]
    >>> print(lon)
    [[ 8.218151   8.2326964  8.2472418 ... 10.1526892 10.1672346 10.18178  ]
     [ 8.218151   8.2326964  8.2472418 ... 10.1526892 10.1672346 10.18178  ]
     [ 8.218151   8.2326964  8.2472418 ... 10.1526892 10.1672346 10.18178  ]
     ...
     [ 8.218151   8.2326964  8.2472418 ... 10.1526892 10.1672346 10.18178  ]
     [ 8.218151   8.2326964  8.2472418 ... 10.1526892 10.1672346 10.18178  ]
     [ 8.218151   8.2326964  8.2472418 ... 10.1526892 10.1672346 10.18178  ]]
     
    ##Extraire la latitude et la longitude dun site donné
    lat_calvi =  42.57
    lon_calvi =  8.75
     
    ##Squared difference of lat and lon
    sq_diff_lat = (lat - lat_calvi)**2
    sq_diff_lon = (lon - lon_calvi)**2
     
    ##Identifying the index of the minimum value for lat and lon
    min_index_lat = sq_diff_lat.argmin()
    min_index_lon = sq_diff_lon.argmin()
     
    >>> print(min_index_lat)
    18224
     
    >>> print(min_index_lon)
    37
     
    temp = data.variables['TEMP'][:]
    >>> print(temp)
    [[[[14.295403480529785 14.60593032836914 15.037308692932129 ...
        13.44691276550293 13.448591232299805 13.447751998901367]
       [14.130069732666016 14.316385269165039 14.63278579711914 ...
        13.44691276550293 13.448591232299805 13.447751998901367]
       [14.061250686645508 14.13510513305664 14.323938369750977 ...
        13.44691276550293 13.448591232299805 13.447751998901367]
       ...
    ##Creer un tableau "vide" que l'on va remplir avec les données
    ##date de début du tableau, index[7] + date de départ
    starting_date = data.variables['time'].units[7] + '2017-04-01'
    >>> starting_date
    ' 2017-04-01'
     
    ##date de fin du tableau, index[7] + date de fin
    ending_date = data.variables['time'].units[7] + '2017-04-30'
    >>> ending_date
    ' 2017-04-30'
     
    date_range = pd.date_range(start = starting_date, end = ending_date)
    >>> date_range
    DatetimeIndex(['2017-04-01', '2017-04-02', '2017-04-03', '2017-04-04',
                   '2017-04-05', '2017-04-06', '2017-04-07', '2017-04-08',
                   '2017-04-09', '2017-04-10', '2017-04-11', '2017-04-12',
                   '2017-04-13', '2017-04-14', '2017-04-15', '2017-04-16',
                   '2017-04-17', '2017-04-18', '2017-04-19', '2017-04-20',
                   '2017-04-21', '2017-04-22', '2017-04-23', '2017-04-24',
                   '2017-04-25', '2017-04-26', '2017-04-27', '2017-04-28',
                   '2017-04-29', '2017-04-30'],
                  dtype='datetime64[ns]', freq='D')
     
     
    df = pd.DataFrame(0, columns = ['temp'], index = date_range)
    >>> df
                temp
    2017-04-01            0
    2017-04-02            0
    2017-04-03            0
    2017-04-04            0
    2017-04-05            0
    2017-04-06            0
    2017-04-07            0
    2017-04-08            0
    2017-04-09            0
    2017-04-10            0
    2017-04-11            0
    2017-04-12            0
    2017-04-13            0
    2017-04-14            0
    2017-04-15            0
    2017-04-16            0
    2017-04-17            0
    2017-04-18            0
    2017-04-19            0
    2017-04-20            0
    2017-04-21            0
    2017-04-22            0
    2017-04-23            0
    2017-04-24            0
    2017-04-25            0
    2017-04-26            0
    2017-04-27            0
    2017-04-28            0
    2017-04-29            0
    2017-04-30            0
     
     
     
    dt = np.arange(0, data.variables['time'].size)
     
    for time_index in dt:
        df.iloc[time_index] = temp[time_index,min_index_lat ,min_index_lon]
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
      File "/gpfs/apps/miniconda3/lib/python3.7/site-packages/numpy/ma/core.py", line 3188, in __getitem__
        dout = self.data[indx]
    IndexError: index 18224 is out of bounds for axis 1 with size 1
     
     
    ##Sauver la série temporelle dans un .csv
    df.to_csv('temp_test.csv')

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Bonsoir

    Il faut bien regarder la taille de vos objets. Rien de tel que des print(mon_array.shape), où vous remplacez mon_array, par bien sûr, vos tableaux à vous, et vérifier que les tailles sont bien celles attendues. Car là le message est clair: vous essayez de lire ou d'écrire une valeur dans une matrice, a un indice qui n'existe pas ! C'est comme si vous demandiez la valeur 3 ième colonne, 10 ligne, d'une matrice 4*4. D'où le problème

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/05/2008, 16h06
  2. extraire fichier joint dans un mail
    Par ramsesthebest dans le forum Web
    Réponses: 5
    Dernier message: 20/12/2007, 14h52
  3. Réponses: 2
    Dernier message: 20/11/2006, 18h37
  4. Réponses: 4
    Dernier message: 15/08/2006, 17h40
  5. Enregistrement fichier excel dans une base mysql (pas csv)
    Par morph12345 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 27/03/2006, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo