@@ -125,6 +125,14 @@ class Timestamp(_Timestamp):
125
125
def freqstr (self ):
126
126
return getattr (self .offset, ' freqstr' , self .offset)
127
127
128
+ def tz_convert (self , tz ):
129
+ if isinstance (tz, basestring ):
130
+ import pytz
131
+ tz = pytz.timezone(tz)
132
+
133
+ conv = tz.normalize(self )
134
+ return Timestamp(conv)
135
+
128
136
cdef inline bint is_timestamp(object o):
129
137
return isinstance (o, Timestamp)
130
138
@@ -232,6 +240,7 @@ cpdef convert_to_tsobject(object ts, object tz=None):
232
240
"""
233
241
cdef:
234
242
_TSObject obj
243
+ bint utc_convert = 1
235
244
236
245
obj = _TSObject()
237
246
@@ -246,8 +255,8 @@ cpdef convert_to_tsobject(object ts, object tz=None):
246
255
obj.value = PyArray_DatetimeStructToDatetime(NPY_FR_us, & obj.dts)
247
256
elif PyDateTime_Check(ts):
248
257
obj.value = _pydatetime_to_dts(ts, & obj.dts)
249
- if tz is None :
250
- tz = ts.tzinfo
258
+ obj.tzinfo = ts.tzinfo
259
+ utc_convert = 0
251
260
elif PyDate_Check(ts):
252
261
obj.value = _date_to_datetime64(ts, & obj.dts)
253
262
else :
@@ -265,8 +274,11 @@ cpdef convert_to_tsobject(object ts, object tz=None):
265
274
inf = tz._transition_info[pos]
266
275
267
276
obj.value = obj.value + deltas[pos]
268
- PyArray_DatetimeToDatetimeStruct(obj.value, NPY_FR_us, & obj.dts)
269
- obj.tzinfo = tz._tzinfos[inf]
277
+
278
+ if utc_convert:
279
+ PyArray_DatetimeToDatetimeStruct(obj.value, NPY_FR_us,
280
+ & obj.dts)
281
+ obj.tzinfo = tz._tzinfos[inf]
270
282
271
283
return obj
272
284
@@ -843,6 +855,43 @@ def tz_convert(ndarray[int64_t] vals, object tz1, object tz2):
843
855
844
856
return result
845
857
858
+ def tz_convert_single (int64_t val , object tz1 , object tz2 ):
859
+ cdef:
860
+ ndarray[int64_t] trans, deltas
861
+ Py_ssize_t pos
862
+ int64_t v, offset, utc_date
863
+
864
+
865
+ if not have_pytz:
866
+ import pytz
867
+
868
+ # Convert to UTC
869
+
870
+ if tz1.zone != ' UTC' :
871
+ deltas = _get_deltas(tz1)
872
+ trans = _get_transitions(tz1)
873
+ pos = trans.searchsorted(val) - 1
874
+ if pos < 0 :
875
+ raise ValueError (' First time before start of DST info' )
876
+ offset = deltas[pos]
877
+ utc_date = val - offset
878
+ else :
879
+ utc_date = val
880
+
881
+ if tz2.zone == ' UTC' :
882
+ return utc_date
883
+
884
+ # Convert UTC to other timezone
885
+ trans = _get_transitions(tz2)
886
+ deltas = _get_deltas(tz2)
887
+ pos = trans.searchsorted(utc_date) - 1
888
+ if pos < 0 :
889
+ raise ValueError (' First time before start of DST info' )
890
+
891
+ offset = deltas[pos]
892
+ return utc_date + offset
893
+
894
+
846
895
trans_cache = {}
847
896
utc_offset_cache = {}
848
897
0 commit comments