@@ -216,17 +216,18 @@ def dehydrate_np_datetime(value):
216216        """ 
217217        if  np .isnat (value ):
218218            return  None 
219-         year  =  value .astype ("datetime64[Y]" ).astype (int ) +  1970 
219+         year  =  value .astype ("datetime64[Y]" ).astype (np . int64 ) +  1970 
220220        if  not  0  <  year  <=  9999 :
221221            # while we could encode years outside the range, they would fail 
222222            # when retrieved from the database. 
223223            raise  ValueError (
224224                f"Year out of range ({ MIN_YEAR :d} { MAX_YEAR :d}  
225225                f"found { year }  
226226            )
227-         seconds  =  value .astype (np .dtype ("datetime64[s]" )).astype (int )
227+         seconds  =  value .astype (np .dtype ("datetime64[s]" )).astype (np . int64 )
228228        nanoseconds  =  (
229-             value .astype (np .dtype ("datetime64[ns]" )).astype (int ) %  NANO_SECONDS 
229+             value .astype (np .dtype ("datetime64[ns]" )).astype (np .int64 )
230+             %  NANO_SECONDS 
230231        )
231232        return  Structure (b"d" , seconds , nanoseconds )
232233
@@ -299,6 +300,7 @@ def dehydrate_timedelta(value):
299300
300301
301302if  np  is  not None :
303+     _NUMPY_DURATION_NS_FALLBACK  =  object ()
302304    _NUMPY_DURATION_UNITS  =  {
303305        "Y" : "years" ,
304306        "M" : "months" ,
@@ -310,6 +312,9 @@ def dehydrate_timedelta(value):
310312        "ms" : "milliseconds" ,
311313        "us" : "microseconds" ,
312314        "ns" : "nanoseconds" ,
315+         "ps" : _NUMPY_DURATION_NS_FALLBACK ,
316+         "fs" : _NUMPY_DURATION_NS_FALLBACK ,
317+         "as" : _NUMPY_DURATION_NS_FALLBACK ,
313318    }
314319
315320    def  dehydrate_np_timedelta (value ):
@@ -323,14 +328,17 @@ def dehydrate_np_timedelta(value):
323328        if  np .isnat (value ):
324329            return  None 
325330        unit , step_size  =  np .datetime_data (value )
326-         numer  =  int (value .astype (int ))
327-         # raise RuntimeError((type(numer), type(step_size))) 
328-         kwarg  =  _NUMPY_DURATION_UNITS .get (unit )
329-         if  kwarg  is  not None :
330-             return  dehydrate_duration (Duration (** {kwarg : numer  *  step_size }))
331-         return  dehydrate_duration (
332-             Duration (nanoseconds = value .astype ("timedelta64[ns]" ).astype (int ))
333-         )
331+         numer  =  int (value .astype (np .int64 ))
332+         try :
333+             kwarg  =  _NUMPY_DURATION_UNITS [unit ]
334+         except  KeyError :
335+             raise  TypeError (
336+                 f"Unsupported numpy.timedelta64 unit: { unit !r}  
337+             ) from  None 
338+         if  kwarg  is  _NUMPY_DURATION_NS_FALLBACK :
339+             nanoseconds  =  value .astype ("timedelta64[ns]" ).astype (np .int64 )
340+             return  dehydrate_duration (Duration (nanoseconds = nanoseconds ))
341+         return  dehydrate_duration (Duration (** {kwarg : numer  *  step_size }))
334342
335343
336344if  pd  is  not None :
0 commit comments