Преобразование данных временных рядов из CSV в NetCDF Python - PullRequest
0 голосов
/ 24 мая 2019

Основная проблема во время этого процесса - код ниже:

precip[:] = orig

Выдает ошибку:

ValueError: cannot reshape array of size 5732784 into shape (39811,144,144)

У меня есть два файла CSV, один из файлов CSV содержит всеФактические данные переменной (осадки), где каждый столбец является станцией, и соответствующие им координаты находятся во втором отдельном файле CSV.Мои примеры данных находятся на Google Drive здесь .

Если вы хотите посмотреть на сами данные, но мой 1-й CSV-файл имеет форму (39811, 144) и 2-й CSV-файлимеет форму (171, 10), но примечание;Я использую только нарезанный кадр данных как (144, 2).

Это код:

stations = pd.read_csv(stn_precip)
stncoords = stations.iloc[:,[0,1]][:144]
orig = pd.read_csv(orig_precip, skiprows = 1, names = stations['Code'][:144])

lons = stncoords['X']
lats = stncoords['Y']

ncout = netCDF4.Dataset('Precip_1910-2018_homomod.nc', 'w')

ncout.createDimension('longitude',lons.shape[0])
ncout.createDimension('latitude',lats.shape[0])
ncout.createDimension('precip',orig.shape[1])
ncout.createDimension('time',orig.shape[0])

lons_out = lons.tolist()
lats_out = lats.tolist()
time_out = orig.index.tolist()

lats = ncout.createVariable('latitude',np.dtype('float32').char,('latitude',))
lons = ncout.createVariable('longitude',np.dtype('float32').char,('longitude',))
time = ncout.createVariable('time',np.dtype('float32').char,('time',))
precip = ncout.createVariable('precip',np.dtype('float32').char,('time', 'longitude','latitude'))

lats[:] = lats_out
lons[:] = lons_out
time[:] = time_out
precip[:] = orig
ncout.close()

Я в основном основываю свой код на этом посте: convert-csv-to-netcdf , но не включает переменную «ВРЕМЯ» в качестве 3-го измерения, поэтому я терплю неудачу.Я думаю, что мне следует ожидать, что переменная осадков будет иметь форму в форме (39811, 144, 144), но ошибка говорит об обратном.

Не совсем уверен, как с этим справиться, любые входные данные приветствуются.

1 Ответ

1 голос
/ 24 мая 2019

Поскольку у вас есть данные с разных станций, я бы предложил использовать размер station для вашего файла netCDF, а не отдельные lon и lat.Конечно, вы можете сохранить долготу и широту каждой станции в отдельной переменной.

Вот одно из возможных решений, используя ваш код в качестве примера:

#!/usr/bin/env ipython
import pandas as pd
import numpy as np
import netCDF4

stn_precip='Precip_1910-2018_stations.csv'
orig_precip='Precip_1910-2018_origvals.csv'
stations = pd.read_csv(stn_precip)
stncoords = stations.iloc[:,[0,1]][:144]
orig = pd.read_csv(orig_precip, skiprows = 1, names = stations['Code'][:144])

lons = stncoords['X']
lats = stncoords['Y']
nstations = np.size(lons)

ncout = netCDF4.Dataset('Precip_1910-2018_homomod.nc', 'w')

ncout.createDimension('station',nstations)
ncout.createDimension('time',orig.shape[0])

lons_out = lons.tolist()
lats_out = lats.tolist()
time_out = orig.index.tolist()

lats = ncout.createVariable('latitude',np.dtype('float32').char,('station',))
lons = ncout.createVariable('longitude',np.dtype('float32').char,('station',))
time = ncout.createVariable('time',np.dtype('float32').char,('time',))
precip = ncout.createVariable('precip',np.dtype('float32').char,('time', 'station'))

lats[:] = lats_out
lons[:] = lons_out
time[:] = time_out
precip[:] = orig
ncout.close()

Итак, информация о выходеФайл (ncdump -h Precip_1910-2018_homomod.nc) выглядит так: enter image description here

...