Извлеките подмножество домена из файла NETCDF и запишите его в текстовый файл на python - PullRequest
0 голосов
/ 02 октября 2019

У меня есть файл netcdf с глобальными данными о ветре, и мне нужно извлечь компонент UGRD и VGRD ветра для моей учебной зоны (lonmin = -2, lonmax = 8, latmin = 35 latmax = 39). Мне нужно иметь текстовый файл в этом формате:

time series                                                                                          UGRD
VGRD
Example
19790101060000 (year month day hours)
3.28 5.26 (UGRD)
2.23 2.225 (VGRD)

Я попытался сделать эту операцию с Python. Мне удалось извлечь мою учебную область в файл nc, но я все еще пытался преобразовать ее в текстовый файл, но мне это не удалось. Может кто-нибудь помочь мне сделать это, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Во-первых, вам нужно изменить свой код, чтобы извлечь необходимые переменные. Например,

data_name1 = 'UGRD_10maboveground'
data_name2 = 'VGRD_10maboveground'
time_name = 'time'
ugrd = f.variables[data_name1][:,y_min:y_max,x_min:x_max]
vgrd = f.variables[data_name2][:,y_min:y_max,x_min:x_max]
time = f.variables[time_name][:]
dtime = netCDF4.num2date(time, time.units)

В вашем коде я не уверен, почему вы извлекаете время и переменные из двух разных наборов данных nc. Обратите внимание, что я просто использовал f здесь для напоминания соответствующего набора данных. Вам также может потребоваться настроить переменную time, чтобы она соответствовала извлеченным ugrd и vgrd.

Теперь вы можете поместить свои извлеченные переменные в pandas dataframe и экспортировать их как csv (найдите документыздесь: dataframe , to_csv ):

df = pd.DataFrame(data={'time': dtime, 'u': ugrd, 'v': vgrd})
df.to_csv('data1.csv', header=True, index=False)

... даст вам CSV, как

t,u,v
1,0,0
2,0,0
...
0 голосов
/ 02 октября 2019
import numpy as np
import netCDF4 
import netCDF4 as nc
import pandas as pd
import numpy as np
import csv
#### === User-inputs ====#####
one = nc.Dataset('1979.nc') ##load one of your nc datafiles

print one.variables ## Check variables names, say my variable names are lat, lon, pre

## Name of the variables
lat_name = 'latitude'
lon_name = 'longitude'
time_name = 'time'
data_name1 = 'UGRD_10maboveground'
data_name2 = 'VGRD_10maboveground'

## Select spatial range for which data to be extracted
mylat1 = 35
mylat2 = 39
mylon1 = -2
mylon2 = 8

##Give a name of your extracted datafile and define units
newfilename = 'Extracted_Data' 
time_unit = 'day since 1979-01-01 00:00'
lat_unit = 'degrees_south'
lon_unit = 'degrees_east'
data_unit = 'm/s'
#### ======= Rest of the Code is Automated ========######

##Find pixel-range based on the provided lat-lon
lat = one.variables[lat_name][:]
lon = one.variables[lon_name][:]

   ver_pix = []
   for i in xrange(0, len(lat)):
        if lat[i] >= mylat1 and lat[i] <= mylat2:
   ver_pix.append(i)

y_min = min(ver_pix)
y_max = max(ver_pix)
print lat[min(ver_pix):max(ver_pix)]


hor_pix = []
for j in xrange(0,len(lon)):
    if lon[j] >= mylon1 and lon[j] <= mylon2:
    hor_pix.append(j)

x_min = min(hor_pix)
x_max = max(hor_pix)
print lon[min(hor_pix):max(hor_pix)]

check_range1 = one.variables[data_name1][:,y_min:y_max,x_min:x_max]  ##pre:lat:lon = 
time,y,x
check_range2 = one.variables[data_name2][:,y_min:y_max,x_min:x_max]
#print check_range
print check_range1.shape
print check_range2.shape


## Load all nc files in the directory from which data to be extracted
## ..for the selected area
f = nc.MFDataset('1979.nc') 
alldata = f.variables[data_name1][:,y_min:y_max,x_min:x_max]
alldata = f.variables[data_name2][:,y_min:y_max,x_min:x_max]
lat1 = one.variables[lat_name][y_min:y_max]
lon1 = one.variables[lon_name][x_min:x_max]
#time = one.variables[time_name][:]

ncfile = nc.Dataset(''+str(newfilename)+'.nc','w')

ncfile.createDimension(time_name,len(alldata))

ncfile.createDimension(lat_name,len(lat1))
ncfile.createDimension(lon_name,len(lon1))

time = ncfile.createVariable(time_name,np.dtype('float32').char,(time_name,))
lats = ncfile.createVariable(lat_name,np.dtype('float32').char,(lat_name,))
lons = ncfile.createVariable(lon_name,np.dtype('float32').char,(lon_name,))

time.units = time_unit
lats.units = lat_unit
lons.units = lon_unit
time[:] = np.linspace(1,len(alldata),len(alldata))
lats[:] = lat1
lons[:] = lon1

newdata1 = ncfile.createVariable(data_name1,np.dtype('float32').char, 
(time_name,lat_name,lon_name))
newdata2 = ncfile.createVariable(data_name2,np.dtype('float32').char, 
(time_name,lat_name,lon_name))
newdata1.units = data_unit 
newdata2.units = data_unit 
newdata1[:] = alldata[:]
newdata2[:] = alldata[:]
dtime=netCDF4.num2date(time[:],time.units)
UGRD_ts=pd.Series(data_name2,index=dtime)
UGRD_ts.to_csv('data1.csv', index=True, header=True)
...