@@ -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