Skip to content

Commit 1070976

Browse files
jbrockmendeljreback
authored andcommitted
Implement _tz_convert_tzlocal_utc for de-duplication (#21727)
1 parent 62a0ebc commit 1070976

File tree

1 file changed

+20
-39
lines changed

1 file changed

+20
-39
lines changed

pandas/_libs/tslibs/conversion.pyx

+20-39
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ cdef inline void localize_tso(_TSObject obj, tzinfo tz):
537537
elif obj.value == NPY_NAT:
538538
pass
539539
elif is_tzlocal(tz):
540-
local_val = tz_convert_utc_to_tzlocal(obj.value, tz)
540+
local_val = _tz_convert_tzlocal_utc(obj.value, tz, to_utc=False)
541541
dt64_to_dtstruct(local_val, &obj.dts)
542542
else:
543543
# Adjust datetime64 timestamp, recompute datetimestruct
@@ -608,32 +608,33 @@ cpdef inline datetime localize_pydatetime(datetime dt, object tz):
608608
# ----------------------------------------------------------------------
609609
# Timezone Conversion
610610

611-
cdef inline int64_t tz_convert_tzlocal_to_utc(int64_t val, tzinfo tz):
611+
cdef inline int64_t _tz_convert_tzlocal_utc(int64_t val, tzinfo tz,
612+
bint to_utc=True):
612613
"""
613614
Parameters
614615
----------
615616
val : int64_t
616617
tz : tzinfo
618+
to_utc : bint
619+
True if converting tzlocal _to_ UTC, False if going the other direction
617620
618621
Returns
619622
-------
620-
utc_date : int64_t
621-
622-
See Also
623-
--------
624-
tz_convert_utc_to_tzlocal
623+
result : int64_t
625624
"""
626625
cdef:
627626
pandas_datetimestruct dts
628-
int64_t utc_date, delta
627+
int64_t result, delta
629628
datetime dt
630629

631630
dt64_to_dtstruct(val, &dts)
632631
dt = datetime(dts.year, dts.month, dts.day, dts.hour,
633632
dts.min, dts.sec, dts.us, tz)
634633
delta = int(get_utcoffset(tz, dt).total_seconds()) * 1000000000
635-
utc_date = val - delta
636-
return utc_date
634+
635+
if not to_utc:
636+
return val + delta
637+
return val - delta
637638

638639

639640
cdef inline int64_t tz_convert_utc_to_tzlocal(int64_t utc_val, tzinfo tz):
@@ -646,27 +647,8 @@ cdef inline int64_t tz_convert_utc_to_tzlocal(int64_t utc_val, tzinfo tz):
646647
Returns
647648
-------
648649
local_val : int64_t
649-
650-
See Also
651-
--------
652-
tz_convert_tzlocal_to_utc
653-
654-
Notes
655-
-----
656-
The key difference between this and tz_convert_tzlocal_to_utc is a
657-
an addition flipped to a subtraction in the last line.
658650
"""
659-
cdef:
660-
pandas_datetimestruct dts
661-
int64_t local_val, delta
662-
datetime dt
663-
664-
dt64_to_dtstruct(utc_val, &dts)
665-
dt = datetime(dts.year, dts.month, dts.day, dts.hour,
666-
dts.min, dts.sec, dts.us, tz)
667-
delta = int(get_utcoffset(tz, dt).total_seconds()) * 1000000000
668-
local_val = utc_val + delta
669-
return local_val
651+
return _tz_convert_tzlocal_utc(utc_val, tz, to_utc=False)
670652

671653

672654
cpdef int64_t tz_convert_single(int64_t val, object tz1, object tz2):
@@ -699,7 +681,7 @@ cpdef int64_t tz_convert_single(int64_t val, object tz1, object tz2):
699681

700682
# Convert to UTC
701683
if is_tzlocal(tz1):
702-
utc_date = tz_convert_tzlocal_to_utc(val, tz1)
684+
utc_date = _tz_convert_tzlocal_utc(val, tz1, to_utc=True)
703685
elif get_timezone(tz1) != 'UTC':
704686
trans, deltas, typ = get_dst_info(tz1)
705687
pos = trans.searchsorted(val, side='right') - 1
@@ -713,7 +695,7 @@ cpdef int64_t tz_convert_single(int64_t val, object tz1, object tz2):
713695
if get_timezone(tz2) == 'UTC':
714696
return utc_date
715697
elif is_tzlocal(tz2):
716-
return tz_convert_utc_to_tzlocal(utc_date, tz2)
698+
return _tz_convert_tzlocal_utc(utc_date, tz2, to_utc=False)
717699

718700
# Convert UTC to other timezone
719701
trans, deltas, typ = get_dst_info(tz2)
@@ -762,7 +744,7 @@ def tz_convert(ndarray[int64_t] vals, object tz1, object tz2):
762744
if v == NPY_NAT:
763745
utc_dates[i] = NPY_NAT
764746
else:
765-
utc_dates[i] = tz_convert_tzlocal_to_utc(v, tz1)
747+
utc_dates[i] = _tz_convert_tzlocal_utc(v, tz1, to_utc=True)
766748
else:
767749
trans, deltas, typ = get_dst_info(tz1)
768750

@@ -797,7 +779,7 @@ def tz_convert(ndarray[int64_t] vals, object tz1, object tz2):
797779
if v == NPY_NAT:
798780
result[i] = NPY_NAT
799781
else:
800-
result[i] = tz_convert_utc_to_tzlocal(v, tz2)
782+
result[i] = _tz_convert_tzlocal_utc(v, tz2, to_utc=False)
801783
return result
802784

803785
# Convert UTC to other timezone
@@ -809,7 +791,7 @@ def tz_convert(ndarray[int64_t] vals, object tz1, object tz2):
809791
return result
810792

811793
# if all NaT, return all NaT
812-
tt = utc_dates[utc_dates!=NPY_NAT]
794+
tt = utc_dates[utc_dates != NPY_NAT]
813795
if not len(tt):
814796
return utc_dates
815797

@@ -874,7 +856,7 @@ def tz_localize_to_utc(ndarray[int64_t] vals, object tz, object ambiguous=None,
874856
if is_tzlocal(tz):
875857
for i in range(n):
876858
v = vals[i]
877-
result[i] = tz_convert_tzlocal_to_utc(v, tz)
859+
result[i] = _tz_convert_tzlocal_utc(v, tz, to_utc=True)
878860
return result
879861

880862
if is_string_object(ambiguous):
@@ -1116,7 +1098,7 @@ cdef ndarray[int64_t] _normalize_local(ndarray[int64_t] stamps, object tz):
11161098
if stamps[i] == NPY_NAT:
11171099
result[i] = NPY_NAT
11181100
continue
1119-
local_val = tz_convert_utc_to_tzlocal(stamps[i], tz)
1101+
local_val = _tz_convert_tzlocal_utc(stamps[i], tz, to_utc=False)
11201102
dt64_to_dtstruct(local_val, &dts)
11211103
result[i] = _normalized_stamp(&dts)
11221104
else:
@@ -1195,7 +1177,7 @@ def is_date_array_normalized(ndarray[int64_t] stamps, tz=None):
11951177
return False
11961178
elif is_tzlocal(tz):
11971179
for i in range(n):
1198-
local_val = tz_convert_utc_to_tzlocal(stamps[i], tz)
1180+
local_val = _tz_convert_tzlocal_utc(stamps[i], tz, to_utc=False)
11991181
dt64_to_dtstruct(local_val, &dts)
12001182
if (dts.hour + dts.min + dts.sec + dts.us) > 0:
12011183
return False
@@ -1205,7 +1187,6 @@ def is_date_array_normalized(ndarray[int64_t] stamps, tz=None):
12051187
for i in range(n):
12061188
# Adjust datetime64 timestamp, recompute datetimestruct
12071189
pos = trans.searchsorted(stamps[i]) - 1
1208-
inf = tz._transition_info[pos]
12091190

12101191
dt64_to_dtstruct(stamps[i] + deltas[pos], &dts)
12111192
if (dts.hour + dts.min + dts.sec + dts.us) > 0:

0 commit comments

Comments
 (0)