@@ -445,7 +445,7 @@ cdef _TSObject convert_datetime_to_tsobject(datetime ts, object tz,
445445
446446
447447cdef _TSObject create_tsobject_tz_using_offset(npy_datetimestruct dts,
448- int tzoffset, object tz = None ):
448+ int tzoffset, tzinfo tz = None ):
449449 """
450450 Convert a datetimestruct `dts`, along with initial timezone offset
451451 `tzoffset` to a _TSObject (with timezone object `tz` - optional).
@@ -847,7 +847,7 @@ cdef inline int64_t _normalize_i8_stamp(int64_t local_val) nogil:
847847
848848@ cython.wraparound (False )
849849@ cython.boundscheck (False )
850- def is_date_array_normalized (const int64_t[:] stamps , object tz = None ):
850+ def is_date_array_normalized (const int64_t[:] stamps , tzinfo tz = None ):
851851 """
852852 Check if all of the given (nanosecond) timestamps are normalized to
853853 midnight, i.e. hour == minute == second == 0. If the optional timezone
@@ -867,20 +867,20 @@ def is_date_array_normalized(const int64_t[:] stamps, object tz=None):
867867 ndarray[int64_t] trans
868868 int64_t[:] deltas
869869 intp_t[:] pos
870- npy_datetimestruct dts
871870 int64_t local_val, delta
872871 str typ
872+ int64_t day_nanos = 24 * 3600 * 1 _000_000_000
873873
874874 if tz is None or is_utc(tz):
875875 for i in range (n):
876- dt64_to_dtstruct( stamps[i], & dts)
877- if (dts.hour + dts.min + dts.sec + dts.us) > 0 :
876+ local_val = stamps[i]
877+ if local_val % day_nanos ! = 0 :
878878 return False
879+
879880 elif is_tzlocal(tz):
880881 for i in range (n):
881882 local_val = tz_convert_utc_to_tzlocal(stamps[i], tz)
882- dt64_to_dtstruct(local_val, & dts)
883- if (dts.hour + dts.min + dts.sec + dts.us) > 0 :
883+ if local_val % day_nanos != 0 :
884884 return False
885885 else :
886886 trans, deltas, typ = get_dst_info(tz)
@@ -890,16 +890,16 @@ def is_date_array_normalized(const int64_t[:] stamps, object tz=None):
890890 delta = deltas[0 ]
891891 for i in range (n):
892892 # Adjust datetime64 timestamp, recompute datetimestruct
893- dt64_to_dtstruct( stamps[i] + delta, & dts)
894- if (dts.hour + dts.min + dts.sec + dts.us) > 0 :
893+ local_val = stamps[i] + delta
894+ if local_val % day_nanos ! = 0 :
895895 return False
896896
897897 else :
898898 pos = trans.searchsorted(stamps) - 1
899899 for i in range (n):
900900 # Adjust datetime64 timestamp, recompute datetimestruct
901- dt64_to_dtstruct( stamps[i] + deltas[pos[i]], & dts)
902- if (dts.hour + dts.min + dts.sec + dts.us) > 0 :
901+ local_val = stamps[i] + deltas[pos[i]]
902+ if local_val % day_nanos ! = 0 :
903903 return False
904904
905905 return True
0 commit comments