简体   繁体   English

如何将日期读入 netcdf4 变量?

[英]How do I read dates into a netcdf4 variable?

I'm trying to put dates into a netcdf4 variable using Python.我正在尝试使用 Python 将日期放入 netcdf4 变量中。 I made an array mom, which contains 30 times a date in the form YYYY/MM/DD;hh:mm:ss.我制作了一个数组 mom,其中包含 30 次格式为 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";该脚本有效并且没有出现任何错误,但是当我查看 netcdf 文件中的数据时, part_starttime="222222222222222222222222222222"; (so 30 times 2) is what's really in the variable. (所以 30 乘以 2)才是真正的变量。 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()

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.你的字符数组只保存每个字符串的第一个值,这就是为什么你得到三十个 2。 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查看 part_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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM