2016-10-12 5 views
1

netCDF4パッケージを使用している間は、netCDFファイルで書き込み時間を使用しています。NetCDFファイルの書き込み時間

dates = [] 
for iday in range(84): 
    dates.append(datetime.datetime(2016, 10, 1) + atetime.timedelta(hours = iday)) 
times[:] = date2num(dates, units=times.units, calendar = imes.calendar) 
# print times[:] 
for ii, i in enumerate(times[:]): 
    print i, num2date(i, units=times.units), dates[ii] 

回は右のとおりです。

17669815.0 2016-10-04 07:00:00 2016-10-04 07:00:00 
17669816.0 2016-10-04 08:00:00.000006 2016-10-04 08:00:00 
17669817.0 2016-10-04 09:00:00 2016-10-04 09:00:00 
17669818.0 2016-10-04 10:00:00 2016-10-04 10:00:00 
17669819.0 2016-10-04 11:00:00.000006 2016-10-04 11:00:00 

しかし、netCDFのファイルの読み取り中:

input_file = '/home/lovechang/test.nc' 
data = Dataset(input_file) 

times = data.variables['time'] 
# print times[:] 
# print num2date(times[:], units=times.units) 
for i in times[:]: 
    print i, num2date(i, units=times.units) 

結果:

17669813.0 2016-10-04 05:00:00.000006 
17669814.0 2016-10-04 06:00:00 
17669815.0 2016-10-04 07:00:00 
17669816.0 2016-10-04 08:00:00.000006 
17669817.0 2016-10-04 09:00:00 
17669818.0 2016-10-04 10:00:00 
17669819.0 2016-10-04 11:00:00.000006 

をNcviewが、時間が時間どおりではありません示してい時間。

screenshot of Ncview program running

何が時代とともに起こったのか? そして、どのようにしてnetcdfファイルに時間を書き込むことができますか?

答えて

2

選択した時間単位とデータ型によっては、浮動小数点精度の問題が発生することがあります。あなたはdays since 1970-01-01 00:00で時間を指定した場合、32ビット浮動小数点では十分ではないですし、代わりに64ビット浮動小数点を使用する必要があります。

import datetime 
import netCDF4 

times = [datetime.datetime(2016, 10, 1) + datetime.timedelta(hours=hour) 
     for hour in range(84)] 

# Create netCDF file 
calendar = 'standard' 
units = 'days since 1970-01-01 00:00' 
ds = netCDF4.Dataset('test.nc', 'w') 
timedim = ds.createDimension(dimname='time', size=len(times)) 

# Write timestamps to netCDF file using 32bit float 
timevar32 = ds.createVariable(varname='time32', dimensions=('time',), 
           datatype='float32') 
timevar32[:] = netCDF4.date2num(times, units=units, calendar=calendar) 

# Write timestamps to netCDF file using 64bit float 
timevar64 = ds.createVariable(varname='time64', dimensions=('time',), 
           datatype='float64') 
timevar64[:] = netCDF4.date2num(times, units=units, calendar=calendar) 

# Read timestamps from netCDF file 
times32 = netCDF4.num2date(timevar32[:], units=units, calendar=calendar) 
times64 = netCDF4.num2date(timevar64[:], units=units, calendar=calendar) 
for time, time32, time64 in zip(times, times32, times64): 
    print "original ", time 
    print " 32 bit ", time32 
    print " 64 bit ", time64 
    print 

あなたはhours since 2016-10-01 00:00で時間を指定した場合は、偶数の整数は十分であろう(これに例)。

+0

それが動作します。 –

関連する問題