Skip to content

Commit 6e50713

Browse files
jbrockmendeljreback
authored andcommitted
implement TimedeltaArray asm8, to_timedelta64 (#23205)
1 parent f27cd71 commit 6e50713

File tree

3 files changed

+89
-0
lines changed

3 files changed

+89
-0
lines changed

pandas/core/arrays/datetimes.py

+16
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,22 @@ def tz_localize(self, tz, ambiguous='raise', errors='raise'):
707707
# ----------------------------------------------------------------
708708
# Conversion Methods - Vectorized analogues of Timestamp methods
709709

710+
def to_datetime64(self):
711+
"""
712+
Return numpy datetime64[ns] representation of self. For timezone-aware
713+
cases, the returned array represents UTC timestamps.
714+
715+
Returns
716+
-------
717+
ndarray[datetime64[ns]]
718+
"""
719+
return self.asi8.view('M8[ns]')
720+
721+
@property
722+
def asm8(self):
723+
"""Vectorized analogue of Timestamp.asm8"""
724+
return self.to_datetime64()
725+
710726
def to_pydatetime(self):
711727
"""
712728
Return Datetime Array/Index as object ndarray of datetime.datetime

pandas/core/arrays/timedeltas.py

+25
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,31 @@ def to_pytimedelta(self):
355355
"""
356356
return tslibs.ints_to_pytimedelta(self.asi8)
357357

358+
def to_timedelta64(self):
359+
"""
360+
Return numpy array with timedelta64[ns] dtype
361+
362+
Returns
363+
-------
364+
ndarray[timedelta64[ns]]
365+
366+
Notes
367+
-----
368+
This returns a view on self, not a copy.
369+
370+
See also
371+
--------
372+
Timedelta.to_timedelta64
373+
"""
374+
return self.asi8.view('m8[ns]')
375+
376+
@property
377+
def asm8(self):
378+
"""
379+
Vectorized analogue of Timedelta.asm8
380+
"""
381+
return self.to_timedelta64()
382+
358383
days = _field_accessor("days", "days",
359384
" Number of days for each element. ")
360385
seconds = _field_accessor("seconds", "seconds",

pandas/tests/arrays/test_datetimelike.py

+48
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,30 @@ def test_to_period(self, datetime_index, freqstr):
106106
# an EA-specific tm.assert_ function
107107
tm.assert_index_equal(pd.Index(result), pd.Index(expected))
108108

109+
def test_asm8(self, datetime_index):
110+
dti = datetime_index
111+
arr = DatetimeArrayMixin(dti)
112+
113+
expected = np.array([x.asm8 for x in dti], dtype='M8[ns]')
114+
115+
result = dti.asm8
116+
tm.assert_numpy_array_equal(result, expected)
117+
118+
result = arr.asm8
119+
tm.assert_numpy_array_equal(result, expected)
120+
121+
def test_to_datetime64(self, datetime_index):
122+
dti = datetime_index
123+
arr = DatetimeArrayMixin(dti)
124+
125+
expected = np.array([x.asm8 for x in dti], dtype='M8[ns]')
126+
127+
result = dti.to_datetime64()
128+
tm.assert_numpy_array_equal(result, expected)
129+
130+
result = arr.to_datetime64()
131+
tm.assert_numpy_array_equal(result, expected)
132+
109133
@pytest.mark.parametrize('propname', pd.DatetimeIndex._bool_ops)
110134
def test_bool_properties(self, datetime_index, propname):
111135
# in this case _bool_ops is just `is_leap_year`
@@ -148,6 +172,30 @@ def test_astype_object(self):
148172
assert asobj.dtype == 'O'
149173
assert list(asobj) == list(tdi)
150174

175+
def test_asm8(self):
176+
tdi = pd.TimedeltaIndex(['1 Hour', '3 Hours'])
177+
arr = TimedeltaArrayMixin(tdi)
178+
179+
expected = np.array([3600, 10800], dtype='m8[ns]') * 1e9
180+
181+
result = tdi.asm8
182+
tm.assert_numpy_array_equal(result, expected)
183+
184+
result = arr.asm8
185+
tm.assert_numpy_array_equal(result, expected)
186+
187+
def test_to_timedelta64(self):
188+
tdi = pd.TimedeltaIndex(['1 Hour', '3 Hours'])
189+
arr = TimedeltaArrayMixin(tdi)
190+
191+
expected = np.array([3600, 10800], dtype='m8[ns]') * 1e9
192+
193+
result = tdi.to_timedelta64()
194+
tm.assert_numpy_array_equal(result, expected)
195+
196+
result = arr.to_timedelta64()
197+
tm.assert_numpy_array_equal(result, expected)
198+
151199
def test_to_pytimedelta(self, timedelta_index):
152200
tdi = timedelta_index
153201
arr = TimedeltaArrayMixin(tdi)

0 commit comments

Comments
 (0)