代码之家  ›  专栏  ›  技术社区  ›  Jellyse

如何将日期读入netcdf4变量?

  •  1
  • Jellyse  · 技术社区  · 8 年前

    我试图使用Python将日期输入到netcdf4变量中。我制作了一个数组mom,它以YYYY/MM/DD的形式包含30次日期;hh:mm:ss。必须是这种格式。该脚本工作正常,没有给出任何错误,但当我查看netcdf文件中的数据时,part\u starttime=“22222222222222222222222”;(30乘以2)才是变量的真正含义。我怎样才能把约会对象放在那里而不是两个人?

    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()
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Rachel    8 年前

    这是由变量的格式和初始化引起的。变量是字符数组。您的字符数组只保存每个字符串的第一个值,这就是为什么您会得到32个。下面的代码使用空字符值初始化空数组。每个数组都是一个字符数组,其元素创建日期时间戳。以下是更新后的代码,以将字符数组用于所需的字符串数据:

    >>> 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()
    

    现在您可以使用 ncdump 查看part\u starttime变量。

    $ 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
    }