In [ ]:
'''
Convert a bunch of GDAL readable grids to a NetCDF Time Series.
Here we read a bunch of files that have names like:
/usgs/data0/prism/1890-1899/us_tmin_1895.01
/usgs/data0/prism/1890-1899/us_tmin_1895.02
...
/usgs/data0/prism/1890-1899/us_tmin_1895.12
'''

In [35]:
import numpy as np
import datetime as dt
import os
import gdal
import netCDF4
import re

In [36]:
ds = gdal.Open('/usgs/data0/prism/1890-1899/us_tmin_1895.01')

In [37]:
a = ds.ReadAsArray()
nlat,nlon = np.shape(a)

In [39]:
b = ds.GetGeoTransform() #bbox, interval
lon = np.arange(nlon)*b[1]+b[0]
lat = np.arange(nlat)*b[5]+b[3]

basedate = dt.datetime(1858,11,17,0,0,0)

In [40]:
cd /usgs/data2/notebook


/usgs/data2/notebook

In [46]:
# create NetCDF file
nco = netCDF4.Dataset('time_series.nc','w',clobber=True)

# chunking is optional, but can improve access a lot: 
# (see: http://www.unidata.ucar.edu/blogs/developer/entry/chunking_data_choosing_shapes)
chunk_lon=16
chunk_lat=16
chunk_time=12

# create dimensions, variables and attributes:
nco.createDimension('lon',nlon)
nco.createDimension('lat',nlat)
nco.createDimension('time',None)
timeo = nco.createVariable('time','f4',('time'))
timeo.units = 'days since 1858-11-17 00:00:00'
timeo.standard_name = 'time'

lono = nco.createVariable('lon','f4',('lon'))
lono.units = 'degrees_east'
lono.standard_name = 'longitude'

lato = nco.createVariable('lat','f4',('lat'))
lato.units = 'degrees_north'
lato.standard_name = 'latitude'

# create container variable for CRS: lon/lat WGS84 datum
crso = nco.createVariable('crs','i4')
csro.long_name = 'Lon/Lat Coords in WGS84'
crso.grid_mapping_name='latitude_longitude'
crso.longitude_of_prime_meridian = 0.0
crso.semi_major_axis = 6378137.0
crso.inverse_flattening = 298.257223563

# create short integer variable for temperature data, with chunking
tmno = nco.createVariable('tmn', 'i2',  ('time', 'lat', 'lon'), 
   zlib=True,chunksizes=[chunk_time,chunk_lat,chunk_lon],fill_value=-9999)
tmno.units = 'degC'
tmno.scale_factor = 0.01
tmno.add_offset = 0.00
tmno.long_name = 'minimum monthly temperature'
tmno.standard_name = 'air_temperature'
tmno.grid_mapping = 'crs'
tmno.set_auto_maskandscale(False)

nco.Conventions='CF-1.6'

#write lon,lat
lono[:]=lon
lato[:]=lat

pat = re.compile('us_tmin_[0-9]{4}\.[0-9]{2}')
itime=0

#step through data, writing time and data to NetCDF
for root, dirs, files in os.walk('/usgs/data0/prism/1890-1899/'):
    dirs.sort()
    files.sort()
    for f in files:
        if re.match(pat,f):
            # read the time values by parsing the filename
            year=int(f[8:12])
            mon=int(f[13:15])
            date=dt.datetime(year,mon,1,0,0,0)
            print(date)
            dtime=(date-basedate).total_seconds()/86400.
            timeo[itime]=dtime
           # min temp
            tmn_path = os.path.join(root,f)
            print(tmn_path)
            tmn=gdal.Open(tmn_path)
            a=tmn.ReadAsArray()  #data
            tmno[itime,:,:]=a
            itime=itime+1

nco.close()


1895-01-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.01
1895-02-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.02
1895-03-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.03
1895-04-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.04
1895-05-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.05
1895-06-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.06
1895-07-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.07
1895-08-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.08
1895-09-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.09
1895-10-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.10
1895-11-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.11
1895-12-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1895.12
1896-01-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.01
1896-02-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.02
1896-03-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.03
1896-04-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.04
1896-05-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.05
1896-06-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.06
1896-07-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.07
1896-08-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.08
1896-09-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.09
1896-10-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.10
1896-11-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.11
1896-12-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1896.12
1897-01-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.01
1897-02-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.02
1897-03-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.03
1897-04-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.04
1897-05-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.05
1897-06-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.06
1897-07-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.07
1897-08-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.08
1897-09-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.09
1897-10-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.10
1897-11-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.11
1897-12-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1897.12
1898-01-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.01
1898-02-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.02
1898-03-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.03
1898-04-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.04
1898-05-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.05
1898-06-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.06
1898-07-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.07
1898-08-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.08
1898-09-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.09
1898-10-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.10
1898-11-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.11
1898-12-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1898.12
1899-01-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.01
1899-02-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.02
1899-03-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.03
1899-04-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.04
1899-05-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.05
1899-06-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.06
1899-07-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.07
1899-08-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.08
1899-09-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.09
1899-10-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.10
1899-11-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.11
1899-12-01 00:00:00
/usgs/data0/prism/1890-1899/us_tmin_1899.12

In [ ]:


In [ ]: