J'ai 1 fichier NetCDF pour le mois de septembre 2007. Il contient 6 données horaires pour certains lat / long avec des variables de vent et d'humidité. Chaque variable a la forme (120, 45, 93)
: 120 fois (4 fois par jour), 45 latitudes et 93 longitudes. Avec le code suivant, je suis en mesure d'obtenir des données moyennes quotidiennes pour toutes les variables. Désormais, chaque variable est de forme (30, 45, 93)
. Le temps est un entier et a une unité de 'heures depuis 1900-01-01 00: 00: 00.0'
.
À partir de ces données quotidiennes moyennes, comment puis-je diviser en 30 fichiers NetCDF différents pour chaque jour, avec le nom du fichier contenant le format d'heure AAAA: MM: JJ
?
import xarray as xr monthly_data = xr.open_dataset('interim_2007-09-01to2007-09-31.nc') daily_data = monthly_data.resample(time='1D').mean()
3 Réponses :
Après avoir parcouru la documentation, vous pouvez utiliser la num2date
de NetCDF4 pour convertir un entier en date.
Vous pouvez également indexer xarray.dataset
en utilisant isel()
:
from netCDF4 import num2date for i in range(30): day = daily_data.isel(time=i) the_date = num2date(day.time.data, units='hours since 1900-01-01 00:00:00') day.to_netcdf(str(the_date.date())+'.nc', format='NETCDF4')
Merci @BanishedBot, cela a vraiment beaucoup aidé. Mais xarray a lu automatiquement les dates pour ne pas nécessiter la conversion.
bien que ce soit des informations utiles (et je l'ai voté pour cela), je ne comprends pas pourquoi c'est la «meilleure» réponse acceptée alors qu'elle ne répond pas réellement à la question posée. La réponse de jhamman fait cela.
Xarray a une fonction de niveau supérieur pour des moments comme celui-ci - xarray.save_mfdataset
. Dans votre cas, vous voudrez utiliser groupby
pour diviser votre ensemble de données en blocs logiques, puis créer une liste de noms de fichiers correspondants. À partir de là, laissez save_mfdataset
faire le reste.
dates, datasets = zip(*ds.resample(time='1D').mean('time').groupby('time')) filenames = [pd.to_datetime(date).strftime('%Y.%m.%d') + '.nc' for date in dates] xr.save_mfdataset(datasets, filenames)
Dans ce cas, est-ce que la liste des ensembles de données groupés créés par zip
doit être suffisamment petite pour pouvoir être manipulée en mémoire en premier lieu?
Non, l'opération groupby renverra des vues ou des tranches différées des données sous-jacentes. Cette approche fonctionnera également mieux lors de l'utilisation de dask car, selon le planificateur que vous utilisez, l'étape save_mfdataset peut être exécutée en parallèle.
une autre clarification serait que où allons-nous diviser l'ensemble de données en morceaux? L'opération groupby
le fait-elle automatiquement? Souvent, je dois utiliser la méthode sel
en boucle, puis enregistrer plusieurs ensembles de données et je me demande si la méthode sel
briserait également automatiquement les ensembles de données en morceaux? Sinon, ce serait la même chose que d'utiliser to_netcdf
. Merci!
Oui, la méthode groupby
divise l'ensemble de données en groupes. Dans votre cas, vous vouliez un groupe pour chaque pas de temps, donc je viens d'utiliser 'time'
. Si je voulais des groupes par année, j'aurais pu utiliser time.year
. Plus d'informations sur les options datetime ici: xarray.pydata.org/ fr / stable /…
merci, au début, je ne comprenais pas clairement la méthode zip
et j'utilisais sel
pour découper les ensembles de données annuels. Maintenant, je peux voir à quel point groupby
pourrait être puissant lorsqu'il est appliqué en combinaison avec save_mfdataset
. Approche géniale!
Juste au cas où cela aiderait quelqu'un, il est également possible d'effectuer cette tâche de calcul de la moyenne quotidienne et de diviser en fichiers quotidiens séparés directement à partir de la ligne de commande:
cdo splitday -daymean in.nc day
qui produit une série de fichiers day01.nc day02.nc ...