Skip to content

Commit ba7fcd5

Browse files
committed
ENH: add basic fold support
1 parent 84bfff2 commit ba7fcd5

File tree

3 files changed

+15
-15
lines changed

3 files changed

+15
-15
lines changed

Diff for: pandas/_libs/tslib.pyx

+10-10
Original file line numberDiff line numberDiff line change
@@ -49,30 +49,30 @@ from pandas._libs.tslibs.tzconversion cimport (
4949

5050
cdef inline object create_datetime_from_ts(
5151
int64_t value, npy_datetimestruct dts,
52-
object tz, object freq):
52+
object tz, object freq, bint fold):
5353
""" convenience routine to construct a datetime.datetime from its parts """
5454
return datetime(dts.year, dts.month, dts.day, dts.hour,
5555
dts.min, dts.sec, dts.us, tz)
5656

5757

5858
cdef inline object create_date_from_ts(
5959
int64_t value, npy_datetimestruct dts,
60-
object tz, object freq):
60+
object tz, object freq, bint fold):
6161
""" convenience routine to construct a datetime.date from its parts """
6262
return date(dts.year, dts.month, dts.day)
6363

6464

6565
cdef inline object create_time_from_ts(
6666
int64_t value, npy_datetimestruct dts,
67-
object tz, object freq):
67+
object tz, object freq, bint fold):
6868
""" convenience routine to construct a datetime.time from its parts """
6969
return time(dts.hour, dts.min, dts.sec, dts.us, tz)
7070

7171

7272
@cython.wraparound(False)
7373
@cython.boundscheck(False)
7474
def ints_to_pydatetime(const int64_t[:] arr, object tz=None, object freq=None,
75-
str box="datetime"):
75+
bint fold=0, str box="datetime"):
7676
"""
7777
Convert an i8 repr to an ndarray of datetimes, date, time or Timestamp
7878
@@ -104,7 +104,7 @@ def ints_to_pydatetime(const int64_t[:] arr, object tz=None, object freq=None,
104104
str typ
105105
int64_t value, delta, local_value
106106
ndarray[object] result = np.empty(n, dtype=object)
107-
object (*func_create)(int64_t, npy_datetimestruct, object, object)
107+
object (*func_create)(int64_t, npy_datetimestruct, object, object, bint)
108108

109109
if box == "date":
110110
assert (tz is None), "tz should be None when converting to date"
@@ -129,7 +129,7 @@ def ints_to_pydatetime(const int64_t[:] arr, object tz=None, object freq=None,
129129
result[i] = <object>NaT
130130
else:
131131
dt64_to_dtstruct(value, &dts)
132-
result[i] = func_create(value, dts, tz, freq)
132+
result[i] = func_create(value, dts, tz, freq, fold)
133133
elif is_tzlocal(tz):
134134
for i in range(n):
135135
value = arr[i]
@@ -141,7 +141,7 @@ def ints_to_pydatetime(const int64_t[:] arr, object tz=None, object freq=None,
141141
# using the i8 representation.
142142
local_value = tz_convert_utc_to_tzlocal(value, tz)
143143
dt64_to_dtstruct(local_value, &dts)
144-
result[i] = func_create(value, dts, tz, freq)
144+
result[i] = func_create(value, dts, tz, freq, fold)
145145
else:
146146
trans, deltas, typ = get_dst_info(tz)
147147

@@ -155,7 +155,7 @@ def ints_to_pydatetime(const int64_t[:] arr, object tz=None, object freq=None,
155155
else:
156156
# Adjust datetime64 timestamp, recompute datetimestruct
157157
dt64_to_dtstruct(value + delta, &dts)
158-
result[i] = func_create(value, dts, tz, freq)
158+
result[i] = func_create(value, dts, tz, freq, fold)
159159

160160
elif typ == 'dateutil':
161161
# no zone-name change for dateutil tzs - dst etc
@@ -168,7 +168,7 @@ def ints_to_pydatetime(const int64_t[:] arr, object tz=None, object freq=None,
168168
# Adjust datetime64 timestamp, recompute datetimestruct
169169
pos = trans.searchsorted(value, side='right') - 1
170170
dt64_to_dtstruct(value + deltas[pos], &dts)
171-
result[i] = func_create(value, dts, tz, freq)
171+
result[i] = func_create(value, dts, tz, freq, fold)
172172
else:
173173
# pytz
174174
for i in range(n):
@@ -182,7 +182,7 @@ def ints_to_pydatetime(const int64_t[:] arr, object tz=None, object freq=None,
182182
new_tz = tz._tzinfos[tz._transition_info[pos]]
183183

184184
dt64_to_dtstruct(value + deltas[pos], &dts)
185-
result[i] = func_create(value, dts, new_tz, freq)
185+
result[i] = func_create(value, dts, new_tz, freq, fold)
186186

187187
return result
188188

Diff for: pandas/_libs/tslibs/timestamps.pxd

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ from pandas._libs.tslibs.np_datetime cimport npy_datetimestruct
55

66
cdef object create_timestamp_from_ts(int64_t value,
77
npy_datetimestruct dts,
8-
object tz, object freq)
8+
object tz, object freq, bint fold)

Diff for: pandas/_libs/tslibs/timestamps.pyx

+4-4
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ _no_input = object()
4242

4343
cdef inline object create_timestamp_from_ts(int64_t value,
4444
npy_datetimestruct dts,
45-
object tz, object freq):
45+
object tz, object freq, bint fold):
4646
""" convenience routine to construct a Timestamp from its parts """
4747
cdef _Timestamp ts_base
4848
ts_base = _Timestamp.__new__(Timestamp, dts.year, dts.month,
4949
dts.day, dts.hour, dts.min,
50-
dts.sec, dts.us, tz)
50+
dts.sec, dts.us, tz, fold=fold)
5151
ts_base.value = value
5252
ts_base.freq = freq
5353
ts_base.nanosecond = dts.ps // 1000
@@ -442,7 +442,7 @@ class Timestamp(_Timestamp):
442442
elif not is_offset_object(freq):
443443
freq = to_offset(freq)
444444

445-
return create_timestamp_from_ts(ts.value, ts.dts, ts.tzinfo, freq)
445+
return create_timestamp_from_ts(ts.value, ts.dts, ts.tzinfo, freq, fold)
446446

447447
def _round(self, freq, mode, ambiguous='raise', nonexistent='raise'):
448448
if self.tz is not None:
@@ -986,7 +986,7 @@ default 'raise'
986986
if value != NPY_NAT:
987987
check_dts_bounds(&dts)
988988

989-
return create_timestamp_from_ts(value, dts, _tzinfo, self.freq)
989+
return create_timestamp_from_ts(value, dts, _tzinfo, self.freq, fold)
990990

991991
def isoformat(self, sep='T'):
992992
base = super(_Timestamp, self).isoformat(sep=sep)

0 commit comments

Comments
 (0)