import numpy as np
|
import pytest
|
|
import pandas._testing as tm
|
from pandas.core.arrays import TimedeltaArray
|
|
|
class TestTimedeltaArrayConstructor:
|
def test_only_1dim_accepted(self):
|
# GH#25282
|
arr = np.array([0, 1, 2, 3], dtype="m8[h]").astype("m8[ns]")
|
|
depr_msg = "TimedeltaArray.__init__ is deprecated"
|
with tm.assert_produces_warning(FutureWarning, match=depr_msg):
|
with pytest.raises(ValueError, match="Only 1-dimensional"):
|
# 3-dim, we allow 2D to sneak in for ops purposes GH#29853
|
TimedeltaArray(arr.reshape(2, 2, 1))
|
|
with tm.assert_produces_warning(FutureWarning, match=depr_msg):
|
with pytest.raises(ValueError, match="Only 1-dimensional"):
|
# 0-dim
|
TimedeltaArray(arr[[0]].squeeze())
|
|
def test_freq_validation(self):
|
# ensure that the public constructor cannot create an invalid instance
|
arr = np.array([0, 0, 1], dtype=np.int64) * 3600 * 10**9
|
|
msg = (
|
"Inferred frequency None from passed values does not "
|
"conform to passed frequency D"
|
)
|
depr_msg = "TimedeltaArray.__init__ is deprecated"
|
with tm.assert_produces_warning(FutureWarning, match=depr_msg):
|
with pytest.raises(ValueError, match=msg):
|
TimedeltaArray(arr.view("timedelta64[ns]"), freq="D")
|
|
def test_non_array_raises(self):
|
depr_msg = "TimedeltaArray.__init__ is deprecated"
|
with tm.assert_produces_warning(FutureWarning, match=depr_msg):
|
with pytest.raises(ValueError, match="list"):
|
TimedeltaArray([1, 2, 3])
|
|
def test_other_type_raises(self):
|
msg = r"dtype bool cannot be converted to timedelta64\[ns\]"
|
with pytest.raises(TypeError, match=msg):
|
TimedeltaArray._from_sequence(np.array([1, 2, 3], dtype="bool"))
|
|
def test_incorrect_dtype_raises(self):
|
msg = "dtype 'category' is invalid, should be np.timedelta64 dtype"
|
with pytest.raises(ValueError, match=msg):
|
TimedeltaArray._from_sequence(
|
np.array([1, 2, 3], dtype="i8"), dtype="category"
|
)
|
|
msg = "dtype 'int64' is invalid, should be np.timedelta64 dtype"
|
with pytest.raises(ValueError, match=msg):
|
TimedeltaArray._from_sequence(
|
np.array([1, 2, 3], dtype="i8"), dtype=np.dtype("int64")
|
)
|
|
msg = r"dtype 'datetime64\[ns\]' is invalid, should be np.timedelta64 dtype"
|
with pytest.raises(ValueError, match=msg):
|
TimedeltaArray._from_sequence(
|
np.array([1, 2, 3], dtype="i8"), dtype=np.dtype("M8[ns]")
|
)
|
|
msg = (
|
r"dtype 'datetime64\[us, UTC\]' is invalid, should be np.timedelta64 dtype"
|
)
|
with pytest.raises(ValueError, match=msg):
|
TimedeltaArray._from_sequence(
|
np.array([1, 2, 3], dtype="i8"), dtype="M8[us, UTC]"
|
)
|
|
msg = "Supported timedelta64 resolutions are 's', 'ms', 'us', 'ns'"
|
with pytest.raises(ValueError, match=msg):
|
TimedeltaArray._from_sequence(
|
np.array([1, 2, 3], dtype="i8"), dtype=np.dtype("m8[Y]")
|
)
|
|
def test_mismatched_values_dtype_units(self):
|
arr = np.array([1, 2, 3], dtype="m8[s]")
|
dtype = np.dtype("m8[ns]")
|
msg = r"Values resolution does not match dtype"
|
depr_msg = "TimedeltaArray.__init__ is deprecated"
|
|
with tm.assert_produces_warning(FutureWarning, match=depr_msg):
|
with pytest.raises(ValueError, match=msg):
|
TimedeltaArray(arr, dtype=dtype)
|
|
def test_copy(self):
|
data = np.array([1, 2, 3], dtype="m8[ns]")
|
arr = TimedeltaArray._from_sequence(data, copy=False)
|
assert arr._ndarray is data
|
|
arr = TimedeltaArray._from_sequence(data, copy=True)
|
assert arr._ndarray is not data
|
assert arr._ndarray.base is not data
|
|
def test_from_sequence_dtype(self):
|
msg = "dtype 'object' is invalid, should be np.timedelta64 dtype"
|
with pytest.raises(ValueError, match=msg):
|
TimedeltaArray._from_sequence([], dtype=object)
|