Skip to content

Commit 4bad8cb

Browse files
authored
TST/REF: collect tests by method (#37589)
* TST/REF: move remaining setitem tests from test_timeseries * TST/REF: rehome test_timezones test * move misplaced arithmetic test * collect tests by method * move misplaced file
1 parent 06251dd commit 4bad8cb

16 files changed

+199
-221
lines changed

pandas/tests/frame/indexing/test_setitem.py

+47
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,53 @@ def test_setitem_extension_types(self, obj, dtype):
185185

186186
tm.assert_frame_equal(df, expected)
187187

188+
def test_setitem_dt64_ndarray_with_NaT_and_diff_time_units(self):
189+
# GH#7492
190+
data_ns = np.array([1, "nat"], dtype="datetime64[ns]")
191+
result = Series(data_ns).to_frame()
192+
result["new"] = data_ns
193+
expected = DataFrame({0: [1, None], "new": [1, None]}, dtype="datetime64[ns]")
194+
tm.assert_frame_equal(result, expected)
195+
196+
# OutOfBoundsDatetime error shouldn't occur
197+
data_s = np.array([1, "nat"], dtype="datetime64[s]")
198+
result["new"] = data_s
199+
expected = DataFrame({0: [1, None], "new": [1e9, None]}, dtype="datetime64[ns]")
200+
tm.assert_frame_equal(result, expected)
201+
202+
@pytest.mark.parametrize("unit", ["h", "m", "s", "ms", "D", "M", "Y"])
203+
def test_frame_setitem_datetime64_col_other_units(self, unit):
204+
# Check that non-nano dt64 values get cast to dt64 on setitem
205+
# into a not-yet-existing column
206+
n = 100
207+
208+
dtype = np.dtype(f"M8[{unit}]")
209+
vals = np.arange(n, dtype=np.int64).view(dtype)
210+
ex_vals = vals.astype("datetime64[ns]")
211+
212+
df = DataFrame({"ints": np.arange(n)}, index=np.arange(n))
213+
df[unit] = vals
214+
215+
assert df[unit].dtype == np.dtype("M8[ns]")
216+
assert (df[unit].values == ex_vals).all()
217+
218+
@pytest.mark.parametrize("unit", ["h", "m", "s", "ms", "D", "M", "Y"])
219+
def test_frame_setitem_existing_datetime64_col_other_units(self, unit):
220+
# Check that non-nano dt64 values get cast to dt64 on setitem
221+
# into an already-existing dt64 column
222+
n = 100
223+
224+
dtype = np.dtype(f"M8[{unit}]")
225+
vals = np.arange(n, dtype=np.int64).view(dtype)
226+
ex_vals = vals.astype("datetime64[ns]")
227+
228+
df = DataFrame({"ints": np.arange(n)}, index=np.arange(n))
229+
df["dates"] = np.arange(n, dtype=np.int64).view("M8[ns]")
230+
231+
# We overwrite existing dt64 column with new, non-nano dt64 vals
232+
df["dates"] = vals
233+
assert (df["dates"].values == ex_vals).all()
234+
188235
def test_setitem_dt64tz(self, timezone_frame):
189236

190237
df = timezone_frame

pandas/tests/frame/methods/test_reset_index.py

+9
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,15 @@ def test_reset_index_tz(self, tz_aware_fixture):
7171
expected["idx"] = expected["idx"].apply(lambda d: Timestamp(d, tz=tz))
7272
tm.assert_frame_equal(df.reset_index(), expected)
7373

74+
@pytest.mark.parametrize("tz", ["US/Eastern", "dateutil/US/Eastern"])
75+
def test_frame_reset_index_tzaware_index(self, tz):
76+
dr = date_range("2012-06-02", periods=10, tz=tz)
77+
df = DataFrame(np.random.randn(len(dr)), dr)
78+
roundtripped = df.reset_index().set_index("index")
79+
xp = df.index.tz
80+
rs = roundtripped.index.tz
81+
assert xp == rs
82+
7483
def test_reset_index_with_intervals(self):
7584
idx = IntervalIndex.from_breaks(np.arange(11), name="x")
7685
original = DataFrame({"x": idx, "y": np.arange(10)})[["x", "y"]]

pandas/tests/frame/methods/test_transpose.py

+21-11
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,63 @@
11
import numpy as np
2+
import pytest
23

3-
import pandas as pd
4+
from pandas import DataFrame, date_range
45
import pandas._testing as tm
56

67

78
class TestTranspose:
89
def test_transpose_tzaware_1col_single_tz(self):
910
# GH#26825
10-
dti = pd.date_range("2016-04-05 04:30", periods=3, tz="UTC")
11+
dti = date_range("2016-04-05 04:30", periods=3, tz="UTC")
1112

12-
df = pd.DataFrame(dti)
13+
df = DataFrame(dti)
1314
assert (df.dtypes == dti.dtype).all()
1415
res = df.T
1516
assert (res.dtypes == dti.dtype).all()
1617

1718
def test_transpose_tzaware_2col_single_tz(self):
1819
# GH#26825
19-
dti = pd.date_range("2016-04-05 04:30", periods=3, tz="UTC")
20+
dti = date_range("2016-04-05 04:30", periods=3, tz="UTC")
2021

21-
df3 = pd.DataFrame({"A": dti, "B": dti})
22+
df3 = DataFrame({"A": dti, "B": dti})
2223
assert (df3.dtypes == dti.dtype).all()
2324
res3 = df3.T
2425
assert (res3.dtypes == dti.dtype).all()
2526

2627
def test_transpose_tzaware_2col_mixed_tz(self):
2728
# GH#26825
28-
dti = pd.date_range("2016-04-05 04:30", periods=3, tz="UTC")
29+
dti = date_range("2016-04-05 04:30", periods=3, tz="UTC")
2930
dti2 = dti.tz_convert("US/Pacific")
3031

31-
df4 = pd.DataFrame({"A": dti, "B": dti2})
32+
df4 = DataFrame({"A": dti, "B": dti2})
3233
assert (df4.dtypes == [dti.dtype, dti2.dtype]).all()
3334
assert (df4.T.dtypes == object).all()
3435
tm.assert_frame_equal(df4.T.T, df4)
3536

37+
@pytest.mark.parametrize("tz", [None, "America/New_York"])
38+
def test_transpose_preserves_dtindex_equality_with_dst(self, tz):
39+
# GH#19970
40+
idx = date_range("20161101", "20161130", freq="4H", tz=tz)
41+
df = DataFrame({"a": range(len(idx)), "b": range(len(idx))}, index=idx)
42+
result = df.T == df.T
43+
expected = DataFrame(True, index=list("ab"), columns=idx)
44+
tm.assert_frame_equal(result, expected)
45+
3646
def test_transpose_object_to_tzaware_mixed_tz(self):
3747
# GH#26825
38-
dti = pd.date_range("2016-04-05 04:30", periods=3, tz="UTC")
48+
dti = date_range("2016-04-05 04:30", periods=3, tz="UTC")
3949
dti2 = dti.tz_convert("US/Pacific")
4050

4151
# mixed all-tzaware dtypes
42-
df2 = pd.DataFrame([dti, dti2])
52+
df2 = DataFrame([dti, dti2])
4353
assert (df2.dtypes == object).all()
4454
res2 = df2.T
4555
assert (res2.dtypes == [dti.dtype, dti2.dtype]).all()
4656

4757
def test_transpose_uint64(self, uint64_frame):
4858

4959
result = uint64_frame.T
50-
expected = pd.DataFrame(uint64_frame.values.T)
60+
expected = DataFrame(uint64_frame.values.T)
5161
expected.index = ["A", "B"]
5262
tm.assert_frame_equal(result, expected)
5363

@@ -63,7 +73,7 @@ def test_transpose_float(self, float_frame):
6373

6474
# mixed type
6575
index, data = tm.getMixedTypeDict()
66-
mixed = pd.DataFrame(data, index=index)
76+
mixed = DataFrame(data, index=index)
6777

6878
mixed_T = mixed.T
6979
for col, s in mixed_T.items():

pandas/tests/frame/test_constructors.py

+29
Original file line numberDiff line numberDiff line change
@@ -2737,6 +2737,35 @@ def test_constructor_list_str_na(self, string_dtype):
27372737

27382738

27392739
class TestDataFrameConstructorWithDatetimeTZ:
2740+
@pytest.mark.parametrize("tz", ["US/Eastern", "dateutil/US/Eastern"])
2741+
def test_construction_preserves_tzaware_dtypes(self, tz):
2742+
# after GH#7822
2743+
# these retain the timezones on dict construction
2744+
dr = date_range("2011/1/1", "2012/1/1", freq="W-FRI")
2745+
dr_tz = dr.tz_localize(tz)
2746+
df = DataFrame({"A": "foo", "B": dr_tz}, index=dr)
2747+
tz_expected = DatetimeTZDtype("ns", dr_tz.tzinfo)
2748+
assert df["B"].dtype == tz_expected
2749+
2750+
# GH#2810 (with timezones)
2751+
datetimes_naive = [ts.to_pydatetime() for ts in dr]
2752+
datetimes_with_tz = [ts.to_pydatetime() for ts in dr_tz]
2753+
df = DataFrame({"dr": dr})
2754+
df["dr_tz"] = dr_tz
2755+
df["datetimes_naive"] = datetimes_naive
2756+
df["datetimes_with_tz"] = datetimes_with_tz
2757+
result = df.dtypes
2758+
expected = Series(
2759+
[
2760+
np.dtype("datetime64[ns]"),
2761+
DatetimeTZDtype(tz=tz),
2762+
np.dtype("datetime64[ns]"),
2763+
DatetimeTZDtype(tz=tz),
2764+
],
2765+
index=["dr", "dr_tz", "datetimes_naive", "datetimes_with_tz"],
2766+
)
2767+
tm.assert_series_equal(result, expected)
2768+
27402769
def test_constructor_data_aware_dtype_naive(self, tz_aware_fixture):
27412770
# GH#25843
27422771
tz = tz_aware_fixture

pandas/tests/frame/test_nonunique_indexes.py

-23
Original file line numberDiff line numberDiff line change
@@ -400,29 +400,6 @@ def check(result, expected=None):
400400
result = z.loc[["a", "c", "a"]]
401401
check(result, expected)
402402

403-
def test_column_dups_indexing2(self):
404-
405-
# GH 8363
406-
# datetime ops with a non-unique index
407-
df = DataFrame(
408-
{"A": np.arange(5, dtype="int64"), "B": np.arange(1, 6, dtype="int64")},
409-
index=[2, 2, 3, 3, 4],
410-
)
411-
result = df.B - df.A
412-
expected = Series(1, index=[2, 2, 3, 3, 4])
413-
tm.assert_series_equal(result, expected)
414-
415-
df = DataFrame(
416-
{
417-
"A": date_range("20130101", periods=5),
418-
"B": date_range("20130101 09:00:00", periods=5),
419-
},
420-
index=[2, 2, 3, 3, 4],
421-
)
422-
result = df.B - df.A
423-
expected = Series(pd.Timedelta("9 hours"), index=[2, 2, 3, 3, 4])
424-
tm.assert_series_equal(result, expected)
425-
426403
def test_columns_with_dups(self):
427404
# GH 3468 related
428405

pandas/tests/frame/test_timeseries.py

-57
This file was deleted.

pandas/tests/frame/test_timezones.py

-60
This file was deleted.

pandas/tests/series/indexing/test_getitem.py

+15
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,21 @@ def test_getitem_boolean_different_order(self, string_series):
271271
exp = string_series[string_series > 0]
272272
tm.assert_series_equal(sel, exp)
273273

274+
def test_getitem_boolean_contiguous_preserve_freq(self):
275+
rng = date_range("1/1/2000", "3/1/2000", freq="B")
276+
277+
mask = np.zeros(len(rng), dtype=bool)
278+
mask[10:20] = True
279+
280+
masked = rng[mask]
281+
expected = rng[10:20]
282+
assert expected.freq == rng.freq
283+
tm.assert_index_equal(masked, expected)
284+
285+
mask[22] = True
286+
masked = rng[mask]
287+
assert masked.freq is None
288+
274289

275290
class TestGetitemCallable:
276291
def test_getitem_callable(self):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import numpy as np
2+
3+
from pandas import Series, date_range
4+
5+
6+
class TestIsMonotonic:
7+
def test_is_monotonic_numeric(self):
8+
9+
ser = Series(np.random.randint(0, 10, size=1000))
10+
assert not ser.is_monotonic
11+
ser = Series(np.arange(1000))
12+
assert ser.is_monotonic is True
13+
assert ser.is_monotonic_increasing is True
14+
ser = Series(np.arange(1000, 0, -1))
15+
assert ser.is_monotonic_decreasing is True
16+
17+
def test_is_monotonic_dt64(self):
18+
19+
ser = Series(date_range("20130101", periods=10))
20+
assert ser.is_monotonic is True
21+
assert ser.is_monotonic_increasing is True
22+
23+
ser = Series(list(reversed(ser)))
24+
assert ser.is_monotonic is False
25+
assert ser.is_monotonic_decreasing is True

0 commit comments

Comments
 (0)