Преобразование файла NetCDF в CSV или текст с помощью Python

Я пытаюсь преобразовать файл netCDF в CSV или текстовый файл с помощью Python. Я прочитал этот пост, но мне все еще не хватает шага (я новичок в Python). Это набор данных, включающий данные о широте, долготе, времени и осадках.

Это мой код на данный момент:

import netCDF4
import pandas as pd

precip_nc_file = 'file_path'
nc = netCDF4.Dataset(precip_nc_file, mode='r')

nc.variables.keys()

lat = nc.variables['lat'][:]
lon = nc.variables['lon'][:]
time_var = nc.variables['time']
dtime = netCDF4.num2date(time_var[:],time_var.units)
precip = nc.variables['precip'][:]

Я не уверен, что делать дальше, но понимаю, что это вопрос создания фрейма данных с помощью pandas.


person aliki43    schedule 04.06.2017    source источник


Ответы (3)


Я думаю, что pandas.Series должен работать для вас, чтобы создать CSV со временем, широтой, долгом и осадками.

import netCDF4
import pandas as pd

precip_nc_file = 'file_path'
nc = netCDF4.Dataset(precip_nc_file, mode='r')

nc.variables.keys()

lat = nc.variables['lat'][:]
lon = nc.variables['lon'][:]
time_var = nc.variables['time']
dtime = netCDF4.num2date(time_var[:],time_var.units)
precip = nc.variables['precip'][:]

# a pandas.Series designed for time series of a 2D lat,lon grid
precip_ts = pd.Series(precip, index=dtime) 

precip_ts.to_csv('precip.csv',index=True, header=True)
person Eric Bridger    schedule 05.06.2017
comment
Спасибо!! Это было прекрасно - person aliki43; 05.06.2017
comment
Пожалуйста. Вы должны принять ответ для будущих читателей. - person Eric Bridger; 06.06.2017

В зависимости от ваших требований вы можете использовать метод savetxt Numpy:

import numpy as np

np.savetxt('lat.csv', lat, delimiter=',')
np.savetxt('lon.csv', lon, delimiter=',')
np.savetxt('precip.csv', precip, delimiter=',')

Однако это приведет к выводу данных без каких-либо заголовков или столбца индекса.

Если вам действительно нужны эти функции, вы можете создать DataFrame и сохранить его как CSV следующим образом:

df_lat = pd.DataFrame(data=lat, index=dtime)
df_lat.to_csv('lat.csv')

# and the same for `lon` and `precip`.

Примечание: здесь я предполагаю, что индекс даты / времени выполняется по первому измерению данных.

person Mac    schedule 05.06.2017
comment
Спасибо! К сожалению, это не сработало - я решил просто извлечь все широты и долготы, которые я использовал в своем другом наборе данных, и перебрал их, чтобы получить временные ряды для каждого места. Как в приведенной выше ссылке. Времени, но работает! - person aliki43; 05.06.2017

person    schedule
comment
Можете ли вы пояснить, почему вы написали этот код, по сравнению с задаваемым вопросом? Как этот код дает ответ на вопрос? - person denis_lor; 11.10.2019
comment
Популярный ответ у меня не сработал. Не знаю почему (может что-то я сделал не так?). Кажется, что библиотека xarray предоставляет решение в меньшем количестве строк кода. Эта альтернатива может сэкономить время некоторым людям, как и мне. - person Robert Davy; 11.10.2019
comment
Что касается другого ответа, который не сработал. Я попробовал это на стандартном файле NOAA mslp netCDF, esrl.noaa.gov/psd/thredds/fileServer/Datasets/ncep.reanalysis2/ и получил следующую ошибку во второй последней строке: - person Robert Davy; 12.10.2019
comment
››› # a pandas.Series, предназначенная для временных рядов двухмерной сетки широты и долготы ... sizes_ts = pd.Series (sizes, index = dtime) Traceback (последний вызов последним): Файл ‹stdin›, строка 2, в файле ‹module› C: \ Users \ dav500 \ AppData \ Local \ Continuum \ anaconda3 \ lib \ site-packages \ pandas \ core \ series.py, строка 262, в init raise_cast_failure = True) Файл C: \ Users \ dav500 \ AppData \ Local \ Continuum \ anaconda3 \ lib \ site-packages \ pandas \ core \ internals \ construction.py, строка 658, в sanitize_array поднять исключение ('Данные должны быть одномерными') Исключение : Данные должны быть одномерными. - person Robert Davy; 12.10.2019
comment
Большое вам спасибо, это сработало для меня так отлично! Я боролся несколько дней, но ты спас меня! - person Jane Kathambi; 28.07.2021