@@ -72,8 +72,9 @@ from pandas._libs.tslibs.nattype cimport (
72
72
)
73
73
from pandas._libs.tslibs.tzconversion cimport (
74
74
bisect_right_i8,
75
- infer_datetuil_fold ,
75
+ infer_dateutil_fold ,
76
76
localize_tzinfo_api,
77
+ tz_convert_from_utc_single,
77
78
tz_localize_to_utc_single,
78
79
)
79
80
@@ -531,7 +532,7 @@ cdef _TSObject _create_tsobject_tz_using_offset(npy_datetimestruct dts,
531
532
if typ == ' dateutil' :
532
533
tdata = < int64_t* > cnp.PyArray_DATA(trans)
533
534
pos = bisect_right_i8(tdata, obj.value, trans.shape[0 ]) - 1
534
- obj.fold = infer_datetuil_fold (obj.value, trans, deltas, pos)
535
+ obj.fold = infer_dateutil_fold (obj.value, trans, deltas, pos)
535
536
536
537
# Keep the converter same as PyDateTime's
537
538
dt = datetime(obj.dts.year, obj.dts.month, obj.dts.day,
@@ -683,7 +684,7 @@ cdef inline void _localize_tso(_TSObject obj, tzinfo tz):
683
684
int64_t[::1 ] deltas
684
685
int64_t local_val
685
686
int64_t* tdata
686
- Py_ssize_t pos, ntrans
687
+ Py_ssize_t pos, ntrans, outpos = - 1
687
688
str typ
688
689
689
690
assert obj.tzinfo is None
@@ -692,35 +693,12 @@ cdef inline void _localize_tso(_TSObject obj, tzinfo tz):
692
693
pass
693
694
elif obj.value == NPY_NAT:
694
695
pass
695
- elif is_tzlocal(tz):
696
- local_val = obj.value + localize_tzinfo_api(obj.value, tz, & obj.fold)
697
- dt64_to_dtstruct(local_val, & obj.dts)
698
696
else :
699
- # Adjust datetime64 timestamp, recompute datetimestruct
700
- trans, deltas, typ = get_dst_info(tz)
701
- ntrans = trans.shape[0 ]
702
-
703
- if typ == " pytz" :
704
- # i.e. treat_tz_as_pytz(tz)
705
- tdata = < int64_t* > cnp.PyArray_DATA(trans)
706
- pos = bisect_right_i8(tdata, obj.value, ntrans) - 1
707
- local_val = obj.value + deltas[pos]
708
-
709
- # find right representation of dst etc in pytz timezone
710
- tz = tz._tzinfos[tz._transition_info[pos]]
711
- elif typ == " dateutil" :
712
- # i.e. treat_tz_as_dateutil(tz)
713
- tdata = < int64_t* > cnp.PyArray_DATA(trans)
714
- pos = bisect_right_i8(tdata, obj.value, ntrans) - 1
715
- local_val = obj.value + deltas[pos]
697
+ local_val = tz_convert_from_utc_single(obj.value, tz, & obj.fold, & outpos)
716
698
717
- # dateutil supports fold, so we infer fold from value
718
- obj.fold = infer_datetuil_fold(obj.value, trans, deltas, pos)
719
- else :
720
- # All other cases have len(deltas) == 1. As of 2018-07-17
721
- # (and 2022-03-07), all test cases that get here have
722
- # is_fixed_offset(tz).
723
- local_val = obj.value + deltas[0 ]
699
+ if outpos != - 1 :
700
+ # infer we went through a pytz path
701
+ tz = tz._tzinfos[tz._transition_info[outpos]]
724
702
725
703
dt64_to_dtstruct(local_val, & obj.dts)
726
704
0 commit comments