I am trying to convert a .csv file to a netCDF4 via Python but I am having trouble figuring out how I can store information from a .csv table format into a netCDF. My main concern is how do we declare the variables from the columns into a workable netCDF4 format? Everything I have found is normally extracting information from a netCDF4 to a .csv or ASCII. I have provided the sample data, sample code, and my errors for declaring the appropriate arrays. Any help would be much appreciated.
The sample table is below:
Station Name Country Code Lat Lon mn.yr temp1 temp2 temp3 hpa
Somewhere US 12340 35.52 23.358 1.19 -8.3 -13.1 -5 69.5
Somewhere US 12340 2.1971 -10.7 -13.9 -7.9 27.9
Somewhere US 12340 3.1971 -8.4 -13 -4.3 90.8
My sample code is:
#!/usr/bin/env python
import scipy
import numpy
import netCDF4
import csv
from numpy import arange, dtype
#Declare empty arrays
v1 = []
v2 = []
v3 = []
v4 = []
# Open csv file and declare variable for arrays for each heading
f = open('station_data.csv', 'r').readlines()
for line in f[1:]:
fields = line.split(',')
v1.append(fields[0]) #station
v2.append(fields[1])#country
v3.append(int(fields[2]))#code
v4.append(float(fields[3]))#lat
v5.append(float(fields[3]))#lon
#more variables included but this is just an abridged list
print v1
print v2
print v3
print v4
#convert to netcdf4 framework that works as a netcdf
ncout = netCDF4.Dataset('station_data.nc','w')
# latitudes and longitudes. Include NaN for missing numbers
lats_out = -25.0 + 5.0*arange(v4,dtype='float32')
lons_out = -125.0 + 5.0*arange(v5,dtype='float32')
# output data.
press_out = 900. + arange(v4*v5,dtype='float32') # 1d array
press_out.shape = (v4,v5) # reshape to 2d array
temp_out = 9. + 0.25*arange(v4*v5,dtype='float32') # 1d array
temp_out.shape = (v4,v5) # reshape to 2d array
# create the lat and lon dimensions.
ncout.createDimension('latitude',v4)
ncout.createDimension('longitude',v5)
# Define the coordinate variables. They will hold the coordinate information
lats = ncout.createVariable('latitude',dtype('float32').char,('latitude',))
lons = ncout.createVariable('longitude',dtype('float32').char,('longitude',))
# Assign units attributes to coordinate var data. This attaches a text attribute to each of the coordinate variables, containing the units.
lats.units = 'degrees_north'
lons.units = 'degrees_east'
# write data to coordinate vars.
lats[:] = lats_out
lons[:] = lons_out
# create the pressure and temperature variables
press = ncout.createVariable('pressure',dtype('float32').char,('latitude','longitude'))
temp = ncout.createVariable('temperature',dtype('float32').char,'latitude','longitude'))
# set the units attribute.
press.units = 'hPa'
temp.units = 'celsius'
# write data to variables.
press[:] = press_out
temp[:] = temp_out
ncout.close()
f.close()
error:
Traceback (most recent call last):
File "station_data.py", line 33, in <module>
v4.append(float(fields[3]))#lat
ValueError: could not convert string to float:
See Question&Answers more detail:
os