Skip to content

Commit 8eb7c53

Browse files
authored
TST/REF: directories for test_period, test_datetimes, test_timedeltas (#39472)
1 parent 373fa72 commit 8eb7c53

14 files changed

+941
-893
lines changed

pandas/tests/arrays/datetimes/__init__.py

Whitespace-only changes.
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
import numpy as np
2+
import pytest
3+
4+
from pandas.core.dtypes.dtypes import DatetimeTZDtype
5+
6+
import pandas as pd
7+
import pandas._testing as tm
8+
from pandas.core.arrays import DatetimeArray
9+
from pandas.core.arrays.datetimes import sequence_to_dt64ns
10+
11+
12+
class TestDatetimeArrayConstructor:
13+
def test_from_sequence_invalid_type(self):
14+
mi = pd.MultiIndex.from_product([np.arange(5), np.arange(5)])
15+
with pytest.raises(TypeError, match="Cannot create a DatetimeArray"):
16+
DatetimeArray._from_sequence(mi)
17+
18+
def test_only_1dim_accepted(self):
19+
arr = np.array([0, 1, 2, 3], dtype="M8[h]").astype("M8[ns]")
20+
21+
with pytest.raises(ValueError, match="Only 1-dimensional"):
22+
# 3-dim, we allow 2D to sneak in for ops purposes GH#29853
23+
DatetimeArray(arr.reshape(2, 2, 1))
24+
25+
with pytest.raises(ValueError, match="Only 1-dimensional"):
26+
# 0-dim
27+
DatetimeArray(arr[[0]].squeeze())
28+
29+
def test_freq_validation(self):
30+
# GH#24623 check that invalid instances cannot be created with the
31+
# public constructor
32+
arr = np.arange(5, dtype=np.int64) * 3600 * 10 ** 9
33+
34+
msg = (
35+
"Inferred frequency H from passed values does not "
36+
"conform to passed frequency W-SUN"
37+
)
38+
with pytest.raises(ValueError, match=msg):
39+
DatetimeArray(arr, freq="W")
40+
41+
@pytest.mark.parametrize(
42+
"meth",
43+
[
44+
DatetimeArray._from_sequence,
45+
sequence_to_dt64ns,
46+
pd.to_datetime,
47+
pd.DatetimeIndex,
48+
],
49+
)
50+
def test_mixing_naive_tzaware_raises(self, meth):
51+
# GH#24569
52+
arr = np.array([pd.Timestamp("2000"), pd.Timestamp("2000", tz="CET")])
53+
54+
msg = (
55+
"Cannot mix tz-aware with tz-naive values|"
56+
"Tz-aware datetime.datetime cannot be converted "
57+
"to datetime64 unless utc=True"
58+
)
59+
60+
for obj in [arr, arr[::-1]]:
61+
# check that we raise regardless of whether naive is found
62+
# before aware or vice-versa
63+
with pytest.raises(ValueError, match=msg):
64+
meth(obj)
65+
66+
def test_from_pandas_array(self):
67+
arr = pd.array(np.arange(5, dtype=np.int64)) * 3600 * 10 ** 9
68+
69+
result = DatetimeArray._from_sequence(arr)._with_freq("infer")
70+
71+
expected = pd.date_range("1970-01-01", periods=5, freq="H")._data
72+
tm.assert_datetime_array_equal(result, expected)
73+
74+
def test_mismatched_timezone_raises(self):
75+
arr = DatetimeArray(
76+
np.array(["2000-01-01T06:00:00"], dtype="M8[ns]"),
77+
dtype=DatetimeTZDtype(tz="US/Central"),
78+
)
79+
dtype = DatetimeTZDtype(tz="US/Eastern")
80+
with pytest.raises(TypeError, match="Timezone of the array"):
81+
DatetimeArray(arr, dtype=dtype)
82+
83+
def test_non_array_raises(self):
84+
with pytest.raises(ValueError, match="list"):
85+
DatetimeArray([1, 2, 3])
86+
87+
def test_bool_dtype_raises(self):
88+
arr = np.array([1, 2, 3], dtype="bool")
89+
90+
with pytest.raises(
91+
ValueError, match="The dtype of 'values' is incorrect.*bool"
92+
):
93+
DatetimeArray(arr)
94+
95+
msg = r"dtype bool cannot be converted to datetime64\[ns\]"
96+
with pytest.raises(TypeError, match=msg):
97+
DatetimeArray._from_sequence(arr)
98+
99+
with pytest.raises(TypeError, match=msg):
100+
sequence_to_dt64ns(arr)
101+
102+
with pytest.raises(TypeError, match=msg):
103+
pd.DatetimeIndex(arr)
104+
105+
with pytest.raises(TypeError, match=msg):
106+
pd.to_datetime(arr)
107+
108+
def test_incorrect_dtype_raises(self):
109+
with pytest.raises(ValueError, match="Unexpected value for 'dtype'."):
110+
DatetimeArray(np.array([1, 2, 3], dtype="i8"), dtype="category")
111+
112+
def test_freq_infer_raises(self):
113+
with pytest.raises(ValueError, match="Frequency inference"):
114+
DatetimeArray(np.array([1, 2, 3], dtype="i8"), freq="infer")
115+
116+
def test_copy(self):
117+
data = np.array([1, 2, 3], dtype="M8[ns]")
118+
arr = DatetimeArray(data, copy=False)
119+
assert arr._data is data
120+
121+
arr = DatetimeArray(data, copy=True)
122+
assert arr._data is not data
123+
124+
125+
class TestSequenceToDT64NS:
126+
def test_tz_dtype_mismatch_raises(self):
127+
arr = DatetimeArray._from_sequence(
128+
["2000"], dtype=DatetimeTZDtype(tz="US/Central")
129+
)
130+
with pytest.raises(TypeError, match="data is already tz-aware"):
131+
sequence_to_dt64ns(arr, dtype=DatetimeTZDtype(tz="UTC"))
132+
133+
def test_tz_dtype_matches(self):
134+
arr = DatetimeArray._from_sequence(
135+
["2000"], dtype=DatetimeTZDtype(tz="US/Central")
136+
)
137+
result, _, _ = sequence_to_dt64ns(arr, dtype=DatetimeTZDtype(tz="US/Central"))
138+
tm.assert_numpy_array_equal(arr._data, result)
139+
140+
@pytest.mark.parametrize("order", ["F", "C"])
141+
def test_2d(self, order):
142+
dti = pd.date_range("2016-01-01", periods=6, tz="US/Pacific")
143+
arr = np.array(dti, dtype=object).reshape(3, 2)
144+
if order == "F":
145+
arr = arr.T
146+
147+
res = sequence_to_dt64ns(arr)
148+
expected = sequence_to_dt64ns(arr.ravel())
149+
150+
tm.assert_numpy_array_equal(res[0].ravel(), expected[0])
151+
assert res[1] == expected[1]
152+
assert res[2] == expected[2]
153+
154+
res = DatetimeArray._from_sequence(arr)
155+
expected = DatetimeArray._from_sequence(arr.ravel()).reshape(arr.shape)
156+
tm.assert_datetime_array_equal(res, expected)
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
import numpy as np
2+
import pytest
3+
4+
from pandas.core.dtypes.dtypes import DatetimeTZDtype
5+
6+
import pandas as pd
7+
from pandas import NaT
8+
import pandas._testing as tm
9+
from pandas.core.arrays import DatetimeArray
10+
11+
12+
class TestReductions:
13+
@pytest.fixture
14+
def arr1d(self, tz_naive_fixture):
15+
tz = tz_naive_fixture
16+
dtype = DatetimeTZDtype(tz=tz) if tz is not None else np.dtype("M8[ns]")
17+
arr = DatetimeArray._from_sequence(
18+
[
19+
"2000-01-03",
20+
"2000-01-03",
21+
"NaT",
22+
"2000-01-02",
23+
"2000-01-05",
24+
"2000-01-04",
25+
],
26+
dtype=dtype,
27+
)
28+
return arr
29+
30+
def test_min_max(self, arr1d):
31+
arr = arr1d
32+
tz = arr.tz
33+
34+
result = arr.min()
35+
expected = pd.Timestamp("2000-01-02", tz=tz)
36+
assert result == expected
37+
38+
result = arr.max()
39+
expected = pd.Timestamp("2000-01-05", tz=tz)
40+
assert result == expected
41+
42+
result = arr.min(skipna=False)
43+
assert result is pd.NaT
44+
45+
result = arr.max(skipna=False)
46+
assert result is pd.NaT
47+
48+
@pytest.mark.parametrize("tz", [None, "US/Central"])
49+
@pytest.mark.parametrize("skipna", [True, False])
50+
def test_min_max_empty(self, skipna, tz):
51+
dtype = DatetimeTZDtype(tz=tz) if tz is not None else np.dtype("M8[ns]")
52+
arr = DatetimeArray._from_sequence([], dtype=dtype)
53+
result = arr.min(skipna=skipna)
54+
assert result is pd.NaT
55+
56+
result = arr.max(skipna=skipna)
57+
assert result is pd.NaT
58+
59+
@pytest.mark.parametrize("tz", [None, "US/Central"])
60+
@pytest.mark.parametrize("skipna", [True, False])
61+
def test_median_empty(self, skipna, tz):
62+
dtype = DatetimeTZDtype(tz=tz) if tz is not None else np.dtype("M8[ns]")
63+
arr = DatetimeArray._from_sequence([], dtype=dtype)
64+
result = arr.median(skipna=skipna)
65+
assert result is pd.NaT
66+
67+
arr = arr.reshape(0, 3)
68+
result = arr.median(axis=0, skipna=skipna)
69+
expected = type(arr)._from_sequence([pd.NaT, pd.NaT, pd.NaT], dtype=arr.dtype)
70+
tm.assert_equal(result, expected)
71+
72+
result = arr.median(axis=1, skipna=skipna)
73+
expected = type(arr)._from_sequence([], dtype=arr.dtype)
74+
tm.assert_equal(result, expected)
75+
76+
def test_median(self, arr1d):
77+
arr = arr1d
78+
79+
result = arr.median()
80+
assert result == arr[0]
81+
result = arr.median(skipna=False)
82+
assert result is pd.NaT
83+
84+
result = arr.dropna().median(skipna=False)
85+
assert result == arr[0]
86+
87+
result = arr.median(axis=0)
88+
assert result == arr[0]
89+
90+
def test_median_axis(self, arr1d):
91+
arr = arr1d
92+
assert arr.median(axis=0) == arr.median()
93+
assert arr.median(axis=0, skipna=False) is pd.NaT
94+
95+
msg = r"abs\(axis\) must be less than ndim"
96+
with pytest.raises(ValueError, match=msg):
97+
arr.median(axis=1)
98+
99+
@pytest.mark.filterwarnings("ignore:All-NaN slice encountered:RuntimeWarning")
100+
def test_median_2d(self, arr1d):
101+
arr = arr1d.reshape(1, -1)
102+
103+
# axis = None
104+
assert arr.median() == arr1d.median()
105+
assert arr.median(skipna=False) is pd.NaT
106+
107+
# axis = 0
108+
result = arr.median(axis=0)
109+
expected = arr1d
110+
tm.assert_equal(result, expected)
111+
112+
# Since column 3 is all-NaT, we get NaT there with or without skipna
113+
result = arr.median(axis=0, skipna=False)
114+
expected = arr1d
115+
tm.assert_equal(result, expected)
116+
117+
# axis = 1
118+
result = arr.median(axis=1)
119+
expected = type(arr)._from_sequence([arr1d.median()])
120+
tm.assert_equal(result, expected)
121+
122+
result = arr.median(axis=1, skipna=False)
123+
expected = type(arr)._from_sequence([pd.NaT], dtype=arr.dtype)
124+
tm.assert_equal(result, expected)
125+
126+
def test_mean(self, arr1d):
127+
arr = arr1d
128+
129+
# manually verified result
130+
expected = arr[0] + 0.4 * pd.Timedelta(days=1)
131+
132+
result = arr.mean()
133+
assert result == expected
134+
result = arr.mean(skipna=False)
135+
assert result is pd.NaT
136+
137+
result = arr.dropna().mean(skipna=False)
138+
assert result == expected
139+
140+
result = arr.mean(axis=0)
141+
assert result == expected
142+
143+
def test_mean_2d(self):
144+
dti = pd.date_range("2016-01-01", periods=6, tz="US/Pacific")
145+
dta = dti._data.reshape(3, 2)
146+
147+
result = dta.mean(axis=0)
148+
expected = dta[1]
149+
tm.assert_datetime_array_equal(result, expected)
150+
151+
result = dta.mean(axis=1)
152+
expected = dta[:, 0] + pd.Timedelta(hours=12)
153+
tm.assert_datetime_array_equal(result, expected)
154+
155+
result = dta.mean(axis=None)
156+
expected = dti.mean()
157+
assert result == expected
158+
159+
@pytest.mark.parametrize("skipna", [True, False])
160+
def test_mean_empty(self, arr1d, skipna):
161+
arr = arr1d[:0]
162+
163+
assert arr.mean(skipna=skipna) is NaT
164+
165+
arr2d = arr.reshape(0, 3)
166+
result = arr2d.mean(axis=0, skipna=skipna)
167+
expected = DatetimeArray._from_sequence([NaT, NaT, NaT], dtype=arr.dtype)
168+
tm.assert_datetime_array_equal(result, expected)
169+
170+
result = arr2d.mean(axis=1, skipna=skipna)
171+
expected = arr # i.e. 1D, empty
172+
tm.assert_datetime_array_equal(result, expected)
173+
174+
result = arr2d.mean(axis=None, skipna=skipna)
175+
assert result is NaT

pandas/tests/arrays/period/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)