Jellyse
Jellyse

Reputation: 863

How do I read dates into a netcdf4 variable?

I'm trying to put dates into a netcdf4 variable using Python. I made an array mom, which contains 30 times a date in the form YYYY/MM/DD;hh:mm:ss. It has to be this format. The script works and does not give any errors, but when I look at the data in the netcdf file, part_starttime= "222222222222222222222222222222"; (so 30 times 2) is what's really in the variable. How do I get my dates in there instead of the twos?

import netCDF4 as nc4
import numpy as np

lon= np.loadtxt('Longitude_Sea_30.txt')#latitude
lat = np.loadtxt('Latitude_Sea_30.txt')#longitude
z = np.tile(1,30)#depth
tijd=np.tile(1,30)#time

Part = np.tile(3,30)

llon=len(lon)
llat=len(lat)
lz=len(z)
ltijd=len(tijd)
lPart=len(Part)

ntime=1
nparticles=30
mom=np.tile("2013/04/22;00:00:00",30)

#create netcdf4 file
f = nc4.Dataset('Stack2.nc','w', format='NETCDF4')

#create group 
Jellygrp = f.createGroup('Jelly')

#Define dimensions

Jellygrp.createDimension('time',None)#
Jellygrp.createDimension('tlendim', 23)  #time
Jellygrp.createDimension('Y009', lPart)
Jellygrp.createDimension('X006', llon) #lon
Jellygrp.createDimension('X007', llat) #lat
Jellygrp.createDimension('X008', lz) #depth

#define arrays

part_xpos= np.zeros((ntime,nparticles))
part_ypos= np.zeros((ntime,nparticles))
part_zpos= np.zeros((ntime,nparticles))
part_starttime= np.zeros((ntime,nparticles))

#create variables

time = Jellygrp.createVariable('time', 'S1', ('time','tlendim'))

part_xpos=Jellygrp.createVariable('part_xpos', 'd', ('time','X006'))
part_ypos=Jellygrp.createVariable('part_ypos','d',('time','X007'))
part_zpos=Jellygrp.createVariable('part_zpos','d',('time','X008'))
part_starttime=Jellygrp.createVariable('part_starttime','S1',
('time','Y009'))

#Passing data into variables

part_xpos[0,:] =lon[:] 
part_ypos[0,:] =lat[:]
part_zpos[0,:] = z[:]
part_starttime[0,:] = mom[:]
print(f.groups['Jelly'])

f.close()

Upvotes: 1

Views: 1166

Answers (1)

Rachel
Rachel

Reputation: 366

This is caused by the format of your variable and initialization. Your variable is a character array. Your character array is only holding the first value of each string, which is why you are getting thirty 2's. The code below initializes your empty array with empty character values. Each array is a character array whose elements create the datetime stamp. Below is your code updated to use a character array for your desired string data:

>>> import netCDF4 as nc4
>>> import numpy as np
>>> 
>>> lon= np.loadtxt('Longitude_Sea_30.txt')#latitude
>>> lat = np.loadtxt('Latitude_Sea_30.txt')#longitude
>>> z = np.tile(1,30)#depth
>>> tijd=np.tile(1,30)#time

# I changed the name to part because Part looked like it was a keyword in 
# your example.  I also changed it to fill with an empty character because I 
# am using it to initialize a character array.
>>> part = np.tile('', 30)
>>> part
array(['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   '', '', '', '', '', '', '', '', '', '', '', '', ''],
  dtype='<U1')
>>> llon=len(lon)
>>> llat=len(lat)
>>> lz=len(z)
>>> ltijd=len(tijd)
# creating length part with part
>>> lPart=len(part)
>>> ntime=1
>>> nparticles=30
>>> 
# This is the datetime string given in your example.  I just set it as a variable.
>>> datetime_string = '2013/04/22;00:00:00'
# I am using full so I can set the empty characters to '' explicitly.
>>> mom = np.full((30, len(datetime_string)), fill_value='')
>>> mom
array([['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', ''],
   ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', '']],
  dtype='<U1')
# Now I am filling in values for mom.  You must break the string into its
# character parts to take advantage of the np.array functionality.
>>> for i in range(0,30):
...     mom[i] = list(datetime_string)
... 
>>> mom
array([['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0'],
   ['2', '0', '1', '3', '/', '0', '4', '/', '2', '2', ';', '0', '0',
    ':', '0', '0', ':', '0', '0']],
  dtype='<U1')

# open your dataset for writing
>>> f = nc4.Dataset('Stack2.nc','w', format='NETCDF4')
>>> Jellygrp = f.createGroup('Jelly')
>>> Jellygrp.createDimension('time',None)
<class 'netCDF4._netCDF4.Dimension'> (unlimited): name = 'time', size = 0

# Create the tlendim with the length of your datetime_string
>>> Jellygrp.createDimension('tlendim', len(datetime_string))
<class 'netCDF4._netCDF4.Dimension'>: name = 'tlendim', size = 19

>>> Jellygrp.createDimension('Y009', lPart)
<class 'netCDF4._netCDF4.Dimension'>: name = 'Y009', size = 30

>>> Jellygrp.createDimension('X006', llon) #lon
<class 'netCDF4._netCDF4.Dimension'>: name = 'X006', size = 30

>>> Jellygrp.createDimension('X007', llat) #lat
<class 'netCDF4._netCDF4.Dimension'>: name = 'X007', size = 30

>>> Jellygrp.createDimension('X008', lz)
<class 'netCDF4._netCDF4.Dimension'>: name = 'X008', size = 30

>>> part_xpos= np.zeros((ntime,nparticles))
>>> part_ypos= np.zeros((ntime,nparticles))
>>> part_zpos= np.zeros((ntime,nparticles))

# Initialize your array to include the length of your desired datetime_string, making it 3 dimensional
>>> part_starttime_array= np.full((ntime,nparticles,len(datetime_string)), fill_value='')

# create your variables
>>> time = Jellygrp.createVariable('time', 'S1', ('time','tlendim'))
>>> part_xpos=Jellygrp.createVariable('part_xpos', 'd', ('time','X006'))
>>> part_ypos=Jellygrp.createVariable('part_ypos','d',('time','X007'))
>>> part_zpos=Jellygrp.createVariable('part_zpos','d',('time','X008'))

# you need to add the length of the datetime_string as a dimension
>>> part_starttime=Jellygrp.createVariable('part_starttime','S1', ('time', 'Y009', 'tlendim'))

# assign to your netCDF variables.
>>> part_xpos[0,:] =lon[:] 
>>> part_ypos[0,:] =lat[:]
>>> part_zpos[0,:] = z[:]
>>> part_starttime[0,:] = mom[:]
>>> f.close()

Now you can use ncdump to view the part_starttime variable.

$ ncdump -v part_starttime Stack2.nc 
netcdf Stack2 {

// global attributes:
        :_NCProperties = 
"version=1|netcdflibversion=4.4.1.1|hdf5libversion=1.8.18" ;

group: Jelly {
  dimensions:
    time = UNLIMITED ; // (1 currently)
    tlendim = 19 ;
    Y009 = 30 ;
    X006 = 30 ;
    X007 = 30 ;
    X008 = 30 ;
  variables:
    char time(time, tlendim) ;
    double part_xpos(time, X006) ;
    double part_ypos(time, X007) ;
    double part_zpos(time, X008) ;
    char part_starttime(time, Y009, tlendim) ;
  data:

   part_starttime =
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00",
  "2013/04/22;00:00:00" ;
  } // group Jelly
}

Upvotes: 1

Related Questions