|
74 | 74 | except NameError: # py3
|
75 | 75 | basestring = str
|
76 | 76 |
|
77 |
| -def ints_to_pydatetime(ndarray[int64_t] arr, tz=None): |
| 77 | +cdef inline object create_timestamp_from_ts(int64_t value, pandas_datetimestruct dts, object tz, object offset): |
| 78 | + cdef _Timestamp ts_base |
| 79 | + ts_base = _Timestamp.__new__(Timestamp, dts.year, dts.month, |
| 80 | + dts.day, dts.hour, dts.min, |
| 81 | + dts.sec, dts.us, tz) |
| 82 | + |
| 83 | + ts_base.value = value |
| 84 | + ts_base.offset = offset |
| 85 | + ts_base.nanosecond = dts.ps / 1000 |
| 86 | + |
| 87 | + return ts_base |
| 88 | + |
| 89 | +cdef inline object create_datetime_from_ts(int64_t value, pandas_datetimestruct dts, object tz, object offset): |
| 90 | + return datetime(dts.year, dts.month, dts.day, dts.hour, |
| 91 | + dts.min, dts.sec, dts.us, tz) |
| 92 | + |
| 93 | +def ints_to_pydatetime(ndarray[int64_t] arr, tz=None, offset=None, box=False): |
| 94 | + # convert an i8 repr to an ndarray of datetimes or Timestamp (if box == True) |
| 95 | + |
78 | 96 | cdef:
|
79 | 97 | Py_ssize_t i, n = len(arr)
|
80 | 98 | pandas_datetimestruct dts
|
| 99 | + object dt |
| 100 | + int64_t value |
81 | 101 | ndarray[object] result = np.empty(n, dtype=object)
|
| 102 | + object (*func_create)(int64_t, pandas_datetimestruct, object, object) |
| 103 | + |
| 104 | + if box and util.is_string_object(offset): |
| 105 | + from pandas.tseries.frequencies import to_offset |
| 106 | + offset = to_offset(offset) |
| 107 | + |
| 108 | + if box: |
| 109 | + func_create = create_timestamp_from_ts |
| 110 | + else: |
| 111 | + func_create = create_datetime_from_ts |
82 | 112 |
|
83 | 113 | if tz is not None:
|
84 | 114 | if _is_utc(tz):
|
85 | 115 | for i in range(n):
|
86 |
| - if arr[i] == iNaT: |
87 |
| - result[i] = np.nan |
| 116 | + value = arr[i] |
| 117 | + if value == iNaT: |
| 118 | + result[i] = NaT |
88 | 119 | else:
|
89 |
| - pandas_datetime_to_datetimestruct(arr[i], PANDAS_FR_ns, &dts) |
90 |
| - result[i] = datetime(dts.year, dts.month, dts.day, dts.hour, |
91 |
| - dts.min, dts.sec, dts.us, tz) |
| 120 | + pandas_datetime_to_datetimestruct(value, PANDAS_FR_ns, &dts) |
| 121 | + result[i] = func_create(value, dts, tz, offset) |
92 | 122 | elif _is_tzlocal(tz) or _is_fixed_offset(tz):
|
93 | 123 | for i in range(n):
|
94 |
| - if arr[i] == iNaT: |
95 |
| - result[i] = np.nan |
| 124 | + value = arr[i] |
| 125 | + if value == iNaT: |
| 126 | + result[i] = NaT |
96 | 127 | else:
|
97 |
| - pandas_datetime_to_datetimestruct(arr[i], PANDAS_FR_ns, &dts) |
98 |
| - dt = datetime(dts.year, dts.month, dts.day, dts.hour, |
99 |
| - dts.min, dts.sec, dts.us, tz) |
| 128 | + pandas_datetime_to_datetimestruct(value, PANDAS_FR_ns, &dts) |
| 129 | + dt = func_create(value, dts, tz, offset) |
100 | 130 | result[i] = dt + tz.utcoffset(dt)
|
101 | 131 | else:
|
102 | 132 | trans = _get_transitions(tz)
|
103 | 133 | deltas = _get_deltas(tz)
|
104 | 134 | for i in range(n):
|
105 | 135 |
|
106 |
| - if arr[i] == iNaT: |
107 |
| - result[i] = np.nan |
| 136 | + value = arr[i] |
| 137 | + if value == iNaT: |
| 138 | + result[i] = NaT |
108 | 139 | else:
|
109 | 140 |
|
110 | 141 | # Adjust datetime64 timestamp, recompute datetimestruct
|
111 |
| - pos = trans.searchsorted(arr[i], side='right') - 1 |
| 142 | + pos = trans.searchsorted(value, side='right') - 1 |
112 | 143 | if _treat_tz_as_pytz(tz):
|
113 | 144 | # find right representation of dst etc in pytz timezone
|
114 | 145 | new_tz = tz._tzinfos[tz._transition_info[pos]]
|
115 | 146 | else:
|
116 | 147 | # no zone-name change for dateutil tzs - dst etc represented in single object.
|
117 | 148 | new_tz = tz
|
118 | 149 |
|
119 |
| - pandas_datetime_to_datetimestruct(arr[i] + deltas[pos], |
120 |
| - PANDAS_FR_ns, &dts) |
121 |
| - result[i] = datetime(dts.year, dts.month, dts.day, dts.hour, |
122 |
| - dts.min, dts.sec, dts.us, |
123 |
| - new_tz) |
| 150 | + pandas_datetime_to_datetimestruct(value + deltas[pos], PANDAS_FR_ns, &dts) |
| 151 | + result[i] = func_create(value, dts, new_tz, offset) |
124 | 152 | else:
|
125 | 153 | for i in range(n):
|
126 |
| - if arr[i] == iNaT: |
127 |
| - result[i] = np.nan |
| 154 | + |
| 155 | + value = arr[i] |
| 156 | + if value == iNaT: |
| 157 | + result[i] = NaT |
128 | 158 | else:
|
129 |
| - pandas_datetime_to_datetimestruct(arr[i], PANDAS_FR_ns, &dts) |
130 |
| - result[i] = datetime(dts.year, dts.month, dts.day, dts.hour, |
131 |
| - dts.min, dts.sec, dts.us) |
| 159 | + pandas_datetime_to_datetimestruct(value, PANDAS_FR_ns, &dts) |
| 160 | + result[i] = func_create(value, dts, None, offset) |
132 | 161 |
|
133 | 162 | return result
|
134 | 163 |
|
@@ -183,6 +212,7 @@ class Timestamp(_Timestamp):
|
183 | 212 | def utcnow(cls):
|
184 | 213 | return cls.now('UTC')
|
185 | 214 |
|
| 215 | + |
186 | 216 | def __new__(cls, object ts_input, object offset=None, tz=None, unit=None):
|
187 | 217 | cdef _TSObject ts
|
188 | 218 | cdef _Timestamp ts_base
|
|
0 commit comments