У меня есть большое количество (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), но я не смог найти ничего, что полностью решило бы мою проблему в другом месте. Спасибо!






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)
@SHV_la - см. Правку 1 выше. В этом случае используйте опцию автоматического закрытия.
вау, невероятно. Это сэкономило столько работы! Спасибо Вам большое :)
Спасибо @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 'в конце имен файлов? или просто файлов много? Я не уверена