Python: цикл для объединения нескольких (200+) файлов netCDF в один файл

У меня есть большое количество (200+) файлов netCDF, которые проиндексированы по дате / времени и содержат 3-часовые измерения осадков для одного места за 20 лет, краткий пример показан ниже.

                        ppt     latitude    longitude
time            
2017-03-01 00:00:00     0.00    16.625      -62.375
2017-03-01 03:00:00     0.00    16.625      -62.375
2017-03-01 06:00:00     0.00    16.625      -62.375
2017-03-01 09:00:00     0.00    16.625      -62.375
2017-03-01 12:00:00     0.00    16.625      -62.375
2017-03-01 15:00:00     0.00    16.625      -62.375

Каждый файл содержит данные за месяц. Моя цель - объединить все эти файлы в один, содержащий все данные за 20 лет. До сих пор я пришел к выводу, что потенциальный путь вперед - извлечь данные из каждого файла netCDF и поместить их в фрейм данных:

import xarray as xr
import pandas as pd

ds = xr.open_dataset('ppt_1_201703.nc')
df = ds.to_dataframe()

Если бы у меня было небольшое количество файлов, было бы достаточно использования concat ([df, df2, df3]), и я бы извлекал данные из каждого файла netCDF вручную. Однако для такого большого количества файлов этот подход, мягко говоря, займет много времени.

До сих пор мои мысли сводились к тому, что лучшим подходом был бы цикл for, который циклически перебирает каждый файл в соответствии с его именем и создает для каждого фрейм данных. Затем мне понадобится еще один цикл for для объединения каждого фрейма данных.

Я не понимаю, как построить эти петли. Имена файлов такие:

ppt_1_199801.nc
ppt_1_199802.nc
ppt_1_199803.nc
...
ppt_1_201610.nc
ppt_1_201611.nc
ppt_1_201612.nc

Есть какие-нибудь идеи? Извините, если ответ прост (я новичок в python), но я не смог найти ничего, что полностью решило бы мою проблему в другом месте. Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
2 230
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Xarray предоставляет функцию open_mfdataset(), которая должна открывать и объединять шаги за вас. В вашем случае вы можете просто сделать:

import xarray as xr

ds = xr.open_mfdataset('ppt_1_*.nc')
df = ds.to_dataframe()

# or
ds = xr.open_mfdataset([list_of_filenames])
df = ds.to_dataframe()

В любом случае xarray будет обрабатывать шаги открытия и объединения в наборе open_mfdataset за вас. Дополнительная информация в документах xarray: http://xarray.pydata.org/en/latest/io.html#combining-multiple-files

Изменить 1:

Если вы имеете дело с большим количеством файлов (их слишком много, чтобы держать их открытыми одновременно), вы можете использовать опцию autoclose=True в open_mfdataset. Это будет выглядеть так:

ds = xr.open_mfdataset('ppt_1_*.nc', autoclose=True)

Спасибо @jhamman, но, к сожалению, это не работает, он возвращает «ERROR: root: Internal Python error in the inspect module». перед тем, как вернуть сообщение с надписью «OSError: [Errno 24] Too many open files». Однако этот метод работает для конкатенации каждый год, т.е. 'ds = xr.open_mfdataset (' ppt_1_1998 * .nc '). Интересно, связана ли ошибка с '01, 02,03 ... 11,12 'в конце имен файлов? или просто файлов много? Я не уверена

SHV_la 23.08.2018 00:04

@SHV_la - см. Правку 1 выше. В этом случае используйте опцию автоматического закрытия.

jhamman 23.08.2018 00:48

вау, невероятно. Это сэкономило столько работы! Спасибо Вам большое :)

SHV_la 23.08.2018 16:09

Другие вопросы по теме