@@ -445,7 +445,7 @@ cdef _TSObject convert_datetime_to_tsobject(datetime ts, object tz,
445
445
446
446
447
447
cdef _TSObject create_tsobject_tz_using_offset(npy_datetimestruct dts,
448
- int tzoffset, object tz = None ):
448
+ int tzoffset, tzinfo tz = None ):
449
449
"""
450
450
Convert a datetimestruct `dts`, along with initial timezone offset
451
451
`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:
847
847
848
848
@ cython.wraparound (False )
849
849
@ 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 ):
851
851
"""
852
852
Check if all of the given (nanosecond) timestamps are normalized to
853
853
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):
867
867
ndarray[int64_t] trans
868
868
int64_t[:] deltas
869
869
intp_t[:] pos
870
- npy_datetimestruct dts
871
870
int64_t local_val, delta
872
871
str typ
872
+ int64_t day_nanos = 24 * 3600 * 1 _000_000_000
873
873
874
874
if tz is None or is_utc(tz):
875
875
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 :
878
878
return False
879
+
879
880
elif is_tzlocal(tz):
880
881
for i in range (n):
881
882
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 :
884
884
return False
885
885
else :
886
886
trans, deltas, typ = get_dst_info(tz)
@@ -890,16 +890,16 @@ def is_date_array_normalized(const int64_t[:] stamps, object tz=None):
890
890
delta = deltas[0 ]
891
891
for i in range (n):
892
892
# 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 :
895
895
return False
896
896
897
897
else :
898
898
pos = trans.searchsorted(stamps) - 1
899
899
for i in range (n):
900
900
# 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 :
903
903
return False
904
904
905
905
return True
0 commit comments