@@ -526,7 +526,7 @@ cdef inline void localize_tso(_TSObject obj, tzinfo tz):
526
526
"""
527
527
cdef:
528
528
ndarray[int64_t] trans, deltas
529
- int64_t delta, local_val
529
+ int64_t local_val
530
530
Py_ssize_t pos
531
531
532
532
assert obj.tzinfo is None
@@ -542,22 +542,23 @@ cdef inline void localize_tso(_TSObject obj, tzinfo tz):
542
542
# Adjust datetime64 timestamp, recompute datetimestruct
543
543
trans, deltas, typ = get_dst_info(tz)
544
544
545
- pos = trans.searchsorted(obj.value, side = ' right' ) - 1
546
-
547
- # static/pytz/dateutil specific code
548
545
if is_fixed_offset(tz):
549
- # statictzinfo
550
- assert len (deltas) == 1 , len (deltas)
546
+ # static/fixed tzinfo; in this case we know len(deltas) == 1
547
+ # This can come back with `typ` of either "fixed" or None
551
548
dt64_to_dtstruct(obj.value + deltas[0 ], & obj.dts)
552
- elif treat_tz_as_pytz(tz):
549
+ elif typ == ' pytz' :
550
+ # i.e. treat_tz_as_pytz(tz)
551
+ pos = trans.searchsorted(obj.value, side = ' right' ) - 1
553
552
tz = tz._tzinfos[tz._transition_info[pos]]
554
553
dt64_to_dtstruct(obj.value + deltas[pos], & obj.dts)
555
- elif treat_tz_as_dateutil(tz):
554
+ elif typ == ' dateutil' :
555
+ # i.e. treat_tz_as_dateutil(tz)
556
+ pos = trans.searchsorted(obj.value, side = ' right' ) - 1
556
557
dt64_to_dtstruct(obj.value + deltas[pos], & obj.dts)
557
558
else :
558
- # TODO: this case is never reached in the tests, but get_dst_info
559
- # has a path that returns typ = None and empty deltas.
560
- # --> Is this path possible?
559
+ # Note: as of 2018-07-17 all tzinfo objects that are _not_
560
+ # either pytz or dateutil have is_fixed_offset(tz) == True,
561
+ # so this branch will never be reached.
561
562
pass
562
563
563
564
obj.tzinfo = tz
@@ -1126,6 +1127,7 @@ cdef ndarray[int64_t] _normalize_local(ndarray[int64_t] stamps, object tz):
1126
1127
ndarray[int64_t] trans, deltas
1127
1128
Py_ssize_t[:] pos
1128
1129
npy_datetimestruct dts
1130
+ int64_t delta
1129
1131
1130
1132
if is_utc(tz):
1131
1133
with nogil:
@@ -1147,17 +1149,17 @@ cdef ndarray[int64_t] _normalize_local(ndarray[int64_t] stamps, object tz):
1147
1149
# Adjust datetime64 timestamp, recompute datetimestruct
1148
1150
trans, deltas, typ = get_dst_info(tz)
1149
1151
1150
- pos = trans.searchsorted(stamps, side = ' right' ) - 1
1151
-
1152
- # statictzinfo
1153
1152
if typ not in [' pytz' , ' dateutil' ]:
1153
+ # static/fixed; in this case we know that len(delta) == 1
1154
+ delta = deltas[0 ]
1154
1155
for i in range (n):
1155
1156
if stamps[i] == NPY_NAT:
1156
1157
result[i] = NPY_NAT
1157
1158
continue
1158
- dt64_to_dtstruct(stamps[i] + deltas[ 0 ] , & dts)
1159
+ dt64_to_dtstruct(stamps[i] + delta , & dts)
1159
1160
result[i] = _normalized_stamp(& dts)
1160
1161
else :
1162
+ pos = trans.searchsorted(stamps, side = ' right' ) - 1
1161
1163
for i in range (n):
1162
1164
if stamps[i] == NPY_NAT:
1163
1165
result[i] = NPY_NAT
@@ -1207,7 +1209,7 @@ def is_date_array_normalized(ndarray[int64_t] stamps, tz=None):
1207
1209
Py_ssize_t i, n = len (stamps)
1208
1210
ndarray[int64_t] trans, deltas
1209
1211
npy_datetimestruct dts
1210
- int64_t local_val
1212
+ int64_t local_val, delta
1211
1213
1212
1214
if tz is None or is_utc(tz):
1213
1215
for i in range (n):
@@ -1223,12 +1225,22 @@ def is_date_array_normalized(ndarray[int64_t] stamps, tz=None):
1223
1225
else :
1224
1226
trans, deltas, typ = get_dst_info(tz)
1225
1227
1226
- for i in range (n):
1227
- # Adjust datetime64 timestamp, recompute datetimestruct
1228
- pos = trans.searchsorted(stamps[i]) - 1
1228
+ if typ not in [' pytz' , ' dateutil' ]:
1229
+ # static/fixed; in this case we know that len(delta) == 1
1230
+ delta = deltas[0 ]
1231
+ for i in range (n):
1232
+ # Adjust datetime64 timestamp, recompute datetimestruct
1233
+ dt64_to_dtstruct(stamps[i] + delta, & dts)
1234
+ if (dts.hour + dts.min + dts.sec + dts.us) > 0 :
1235
+ return False
1229
1236
1230
- dt64_to_dtstruct(stamps[i] + deltas[pos], & dts)
1231
- if (dts.hour + dts.min + dts.sec + dts.us) > 0 :
1232
- return False
1237
+ else :
1238
+ for i in range (n):
1239
+ # Adjust datetime64 timestamp, recompute datetimestruct
1240
+ pos = trans.searchsorted(stamps[i]) - 1
1241
+
1242
+ dt64_to_dtstruct(stamps[i] + deltas[pos], & dts)
1243
+ if (dts.hour + dts.min + dts.sec + dts.us) > 0 :
1244
+ return False
1233
1245
1234
1246
return True
0 commit comments