Skip to content

Commit a9cb17a

Browse files
authored
PERF: is_date_array_normalized (#34707)
1 parent cfc9c0e commit a9cb17a

File tree

1 file changed

+11
-11
lines changed

1 file changed

+11
-11
lines changed

pandas/_libs/tslibs/conversion.pyx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ cdef _TSObject convert_datetime_to_tsobject(datetime ts, object tz,
445445

446446

447447
cdef _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

Comments
 (0)