11from parcels .tools .loggers import logger
22from parcels .tools .converters import unitconverters_map , UnitConverter , Geographic , GeographicPolar
3+ from parcels .tools .converters import TimeConverter
34from parcels .tools .error import FieldSamplingError , TimeExtrapolationError
45from collections import Iterable
56from py import path
@@ -44,7 +45,7 @@ class Field(object):
4445 :param transpose: Transpose data to required (lon, lat) layout
4546 :param vmin: Minimum allowed value on the field. Data below this value are set to zero
4647 :param vmax: Maximum allowed value on the field. Data above this value are set to zero
47- :param time_origin: Time origin (datetime or np.datetime64 object) of the time axis (only if grid is None)
48+ :param time_origin: Time origin (TimeConverter object) of the time axis (only if grid is None)
4849 :param interp_method: Method for interpolation. Either 'linear' or 'nearest'
4950 :param allow_time_extrapolation: boolean whether to allow for extrapolation in time
5051 (i.e. beyond the last available time snapshot)
@@ -57,6 +58,7 @@ def __init__(self, name, data, lon=None, lat=None, depth=None, time=None, grid=N
5758 interp_method = 'linear' , allow_time_extrapolation = None , time_periodic = False , ** kwargs ):
5859 self .name = name
5960 self .data = data
61+ time_origin = TimeConverter (0 ) if time_origin is None else time_origin
6062 if grid :
6163 self .grid = grid
6264 else :
@@ -68,7 +70,6 @@ def __init__(self, name, data, lon=None, lat=None, depth=None, time=None, grid=N
6870 self .lon = self .grid .lon
6971 self .lat = self .grid .lat
7072 self .depth = self .grid .depth
71- self .time = self .grid .time
7273 fieldtype = self .name if fieldtype is None else fieldtype
7374 if self .grid .mesh == 'flat' or (fieldtype not in unitconverters_map .keys ()):
7475 self .units = UnitConverter ()
@@ -181,15 +182,12 @@ def from_netcdf(cls, filenames, variable, dimensions, indices=None, grid=None,
181182 timeslices = np .array (timeslices )
182183 time = np .concatenate (timeslices )
183184 dataFiles = np .concatenate (np .array (dataFiles ))
184- if isinstance (time [0 ], np .datetime64 ):
185- time_origin = time [0 ]
186- time = (time - time_origin ) / np .timedelta64 (1 , 's' )
187- else :
188- time_origin = None
189- assert (np .all ((time [1 :]- time [:- 1 ]) > 0 ))
190-
191185 if time .size == 1 and time [0 ] is None :
192186 time [0 ] = 0
187+ time_origin = TimeConverter (time [0 ])
188+ time = time_origin .reltime (time )
189+ assert (np .all ((time [1 :]- time [:- 1 ]) > 0 ))
190+
193191 if len (lon .shape ) == 1 :
194192 if len (depth .shape ) == 1 :
195193 grid = RectilinearZGrid (lon , lat , depth , time , time_origin = time_origin , mesh = mesh )
@@ -815,7 +813,7 @@ def write(self, filename, varname=None):
815813 else :
816814 raise NotImplementedError ('Field.write only implemented for RectilinearZGrid and CurvilinearZGrid' )
817815
818- attrs = {'units' : 'seconds since ' + str (self .grid .time_origin )} if self .grid .time_origin else {}
816+ attrs = {'units' : 'seconds since ' + str (self .grid .time_origin )} if self .grid .time_origin . calendar else {}
819817 time_counter = xr .DataArray (self .grid .time ,
820818 dims = ['time_counter' ],
821819 attrs = attrs )
@@ -842,9 +840,7 @@ def computeTimeChunk(self, data, tindex):
842840 with NetcdfFileBuffer (self .dataFiles [g .ti + tindex ], self .dimensions , self .indices , self .netcdf_engine ) as filebuffer :
843841 filebuffer .name = filebuffer .parse_name (self .dimensions , self .name )
844842 time_data = filebuffer .time
845- if isinstance (time_data [0 ], np .datetime64 ):
846- assert isinstance (time_data [0 ], type (g .time_origin )), ('Field %s stores times as dates, but time_origin is not defined ' % self .name )
847- time_data = (time_data - g .time_origin ) / np .timedelta64 (1 , 's' )
843+ time_data = g .time_origin .reltime (time_data )
848844 ti = (time_data <= g .time [tindex ]).argmin () - 1
849845 if len (filebuffer .dataset [filebuffer .name ].shape ) == 2 :
850846 data [tindex , 0 , :, :] = filebuffer .data [:, :]
0 commit comments