Skip to content

Commit 69f4c70

Browse files
authored
REF/TST: method-specific files for DataFrame timeseries methods (#32230)
1 parent e88629f commit 69f4c70

File tree

9 files changed

+403
-366
lines changed

9 files changed

+403
-366
lines changed

pandas/tests/frame/conftest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
1+
from itertools import product
2+
13
import numpy as np
24
import pytest
35

46
from pandas import DataFrame, NaT, date_range
57
import pandas._testing as tm
68

79

10+
@pytest.fixture(params=product([True, False], [True, False]))
11+
def close_open_fixture(request):
12+
return request.param
13+
14+
815
@pytest.fixture
916
def float_frame_with_na():
1017
"""
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
from datetime import datetime
2+
3+
import numpy as np
4+
5+
from pandas import DataFrame, DatetimeIndex, Series, date_range
6+
import pandas._testing as tm
7+
8+
from pandas.tseries import offsets
9+
10+
11+
class TestAsFreq:
12+
def test_asfreq(self, datetime_frame):
13+
offset_monthly = datetime_frame.asfreq(offsets.BMonthEnd())
14+
rule_monthly = datetime_frame.asfreq("BM")
15+
16+
tm.assert_almost_equal(offset_monthly["A"], rule_monthly["A"])
17+
18+
filled = rule_monthly.asfreq("B", method="pad") # noqa
19+
# TODO: actually check that this worked.
20+
21+
# don't forget!
22+
filled_dep = rule_monthly.asfreq("B", method="pad") # noqa
23+
24+
# test does not blow up on length-0 DataFrame
25+
zero_length = datetime_frame.reindex([])
26+
result = zero_length.asfreq("BM")
27+
assert result is not zero_length
28+
29+
def test_asfreq_datetimeindex(self):
30+
df = DataFrame(
31+
{"A": [1, 2, 3]},
32+
index=[datetime(2011, 11, 1), datetime(2011, 11, 2), datetime(2011, 11, 3)],
33+
)
34+
df = df.asfreq("B")
35+
assert isinstance(df.index, DatetimeIndex)
36+
37+
ts = df["A"].asfreq("B")
38+
assert isinstance(ts.index, DatetimeIndex)
39+
40+
def test_asfreq_fillvalue(self):
41+
# test for fill value during upsampling, related to issue 3715
42+
43+
# setup
44+
rng = date_range("1/1/2016", periods=10, freq="2S")
45+
ts = Series(np.arange(len(rng)), index=rng)
46+
df = DataFrame({"one": ts})
47+
48+
# insert pre-existing missing value
49+
df.loc["2016-01-01 00:00:08", "one"] = None
50+
51+
actual_df = df.asfreq(freq="1S", fill_value=9.0)
52+
expected_df = df.asfreq(freq="1S").fillna(9.0)
53+
expected_df.loc["2016-01-01 00:00:08", "one"] = None
54+
tm.assert_frame_equal(expected_df, actual_df)
55+
56+
expected_series = ts.asfreq(freq="1S").fillna(9.0)
57+
actual_series = ts.asfreq(freq="1S", fill_value=9.0)
58+
tm.assert_series_equal(expected_series, actual_series)
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
from datetime import time
2+
3+
import numpy as np
4+
import pytest
5+
import pytz
6+
7+
from pandas import DataFrame, date_range
8+
import pandas._testing as tm
9+
10+
11+
class TestAtTime:
12+
def test_at_time(self):
13+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
14+
ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
15+
rs = ts.at_time(rng[1])
16+
assert (rs.index.hour == rng[1].hour).all()
17+
assert (rs.index.minute == rng[1].minute).all()
18+
assert (rs.index.second == rng[1].second).all()
19+
20+
result = ts.at_time("9:30")
21+
expected = ts.at_time(time(9, 30))
22+
tm.assert_frame_equal(result, expected)
23+
24+
result = ts.loc[time(9, 30)]
25+
expected = ts.loc[(rng.hour == 9) & (rng.minute == 30)]
26+
27+
tm.assert_frame_equal(result, expected)
28+
29+
# midnight, everything
30+
rng = date_range("1/1/2000", "1/31/2000")
31+
ts = DataFrame(np.random.randn(len(rng), 3), index=rng)
32+
33+
result = ts.at_time(time(0, 0))
34+
tm.assert_frame_equal(result, ts)
35+
36+
# time doesn't exist
37+
rng = date_range("1/1/2012", freq="23Min", periods=384)
38+
ts = DataFrame(np.random.randn(len(rng), 2), rng)
39+
rs = ts.at_time("16:00")
40+
assert len(rs) == 0
41+
42+
@pytest.mark.parametrize(
43+
"hour", ["1:00", "1:00AM", time(1), time(1, tzinfo=pytz.UTC)]
44+
)
45+
def test_at_time_errors(self, hour):
46+
# GH#24043
47+
dti = date_range("2018", periods=3, freq="H")
48+
df = DataFrame(list(range(len(dti))), index=dti)
49+
if getattr(hour, "tzinfo", None) is None:
50+
result = df.at_time(hour)
51+
expected = df.iloc[1:2]
52+
tm.assert_frame_equal(result, expected)
53+
else:
54+
with pytest.raises(ValueError, match="Index must be timezone"):
55+
df.at_time(hour)
56+
57+
def test_at_time_tz(self):
58+
# GH#24043
59+
dti = date_range("2018", periods=3, freq="H", tz="US/Pacific")
60+
df = DataFrame(list(range(len(dti))), index=dti)
61+
result = df.at_time(time(4, tzinfo=pytz.timezone("US/Eastern")))
62+
expected = df.iloc[1:2]
63+
tm.assert_frame_equal(result, expected)
64+
65+
def test_at_time_raises(self):
66+
# GH#20725
67+
df = DataFrame([[1, 2, 3], [4, 5, 6]])
68+
with pytest.raises(TypeError): # index is not a DatetimeIndex
69+
df.at_time("00:00")
70+
71+
@pytest.mark.parametrize("axis", ["index", "columns", 0, 1])
72+
def test_at_time_axis(self, axis):
73+
# issue 8839
74+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
75+
ts = DataFrame(np.random.randn(len(rng), len(rng)))
76+
ts.index, ts.columns = rng, rng
77+
78+
indices = rng[(rng.hour == 9) & (rng.minute == 30) & (rng.second == 0)]
79+
80+
if axis in ["index", 0]:
81+
expected = ts.loc[indices, :]
82+
elif axis in ["columns", 1]:
83+
expected = ts.loc[:, indices]
84+
85+
result = ts.at_time("9:30", axis=axis)
86+
tm.assert_frame_equal(result, expected)
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
from datetime import time
2+
3+
import numpy as np
4+
import pytest
5+
6+
from pandas import DataFrame, date_range
7+
import pandas._testing as tm
8+
9+
10+
class TestBetweenTime:
11+
def test_between_time(self, close_open_fixture):
12+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
13+
ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
14+
stime = time(0, 0)
15+
etime = time(1, 0)
16+
inc_start, inc_end = close_open_fixture
17+
18+
filtered = ts.between_time(stime, etime, inc_start, inc_end)
19+
exp_len = 13 * 4 + 1
20+
if not inc_start:
21+
exp_len -= 5
22+
if not inc_end:
23+
exp_len -= 4
24+
25+
assert len(filtered) == exp_len
26+
for rs in filtered.index:
27+
t = rs.time()
28+
if inc_start:
29+
assert t >= stime
30+
else:
31+
assert t > stime
32+
33+
if inc_end:
34+
assert t <= etime
35+
else:
36+
assert t < etime
37+
38+
result = ts.between_time("00:00", "01:00")
39+
expected = ts.between_time(stime, etime)
40+
tm.assert_frame_equal(result, expected)
41+
42+
# across midnight
43+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
44+
ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
45+
stime = time(22, 0)
46+
etime = time(9, 0)
47+
48+
filtered = ts.between_time(stime, etime, inc_start, inc_end)
49+
exp_len = (12 * 11 + 1) * 4 + 1
50+
if not inc_start:
51+
exp_len -= 4
52+
if not inc_end:
53+
exp_len -= 4
54+
55+
assert len(filtered) == exp_len
56+
for rs in filtered.index:
57+
t = rs.time()
58+
if inc_start:
59+
assert (t >= stime) or (t <= etime)
60+
else:
61+
assert (t > stime) or (t <= etime)
62+
63+
if inc_end:
64+
assert (t <= etime) or (t >= stime)
65+
else:
66+
assert (t < etime) or (t >= stime)
67+
68+
def test_between_time_raises(self):
69+
# GH#20725
70+
df = DataFrame([[1, 2, 3], [4, 5, 6]])
71+
with pytest.raises(TypeError): # index is not a DatetimeIndex
72+
df.between_time(start_time="00:00", end_time="12:00")
73+
74+
def test_between_time_axis(self, axis):
75+
# GH#8839
76+
rng = date_range("1/1/2000", periods=100, freq="10min")
77+
ts = DataFrame(np.random.randn(len(rng), len(rng)))
78+
stime, etime = ("08:00:00", "09:00:00")
79+
exp_len = 7
80+
81+
if axis in ["index", 0]:
82+
ts.index = rng
83+
assert len(ts.between_time(stime, etime)) == exp_len
84+
assert len(ts.between_time(stime, etime, axis=0)) == exp_len
85+
86+
if axis in ["columns", 1]:
87+
ts.columns = rng
88+
selected = ts.between_time(stime, etime, axis=1).columns
89+
assert len(selected) == exp_len
90+
91+
def test_between_time_axis_raises(self, axis):
92+
# issue 8839
93+
rng = date_range("1/1/2000", periods=100, freq="10min")
94+
mask = np.arange(0, len(rng))
95+
rand_data = np.random.randn(len(rng), len(rng))
96+
ts = DataFrame(rand_data, index=rng, columns=rng)
97+
stime, etime = ("08:00:00", "09:00:00")
98+
99+
msg = "Index must be DatetimeIndex"
100+
if axis in ["columns", 1]:
101+
ts.index = mask
102+
with pytest.raises(TypeError, match=msg):
103+
ts.between_time(stime, etime)
104+
with pytest.raises(TypeError, match=msg):
105+
ts.between_time(stime, etime, axis=0)
106+
107+
if axis in ["index", 0]:
108+
ts.columns = mask
109+
with pytest.raises(TypeError, match=msg):
110+
ts.between_time(stime, etime, axis=1)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import numpy as np
2+
import pytest
3+
4+
from pandas import DataFrame, date_range, period_range
5+
import pandas._testing as tm
6+
7+
8+
class TestToPeriod:
9+
def test_frame_to_period(self):
10+
K = 5
11+
12+
dr = date_range("1/1/2000", "1/1/2001")
13+
pr = period_range("1/1/2000", "1/1/2001")
14+
df = DataFrame(np.random.randn(len(dr), K), index=dr)
15+
df["mix"] = "a"
16+
17+
pts = df.to_period()
18+
exp = df.copy()
19+
exp.index = pr
20+
tm.assert_frame_equal(pts, exp)
21+
22+
pts = df.to_period("M")
23+
tm.assert_index_equal(pts.index, exp.index.asfreq("M"))
24+
25+
df = df.T
26+
pts = df.to_period(axis=1)
27+
exp = df.copy()
28+
exp.columns = pr
29+
tm.assert_frame_equal(pts, exp)
30+
31+
pts = df.to_period("M", axis=1)
32+
tm.assert_index_equal(pts.columns, exp.columns.asfreq("M"))
33+
34+
msg = "No axis named 2 for object type <class 'pandas.core.frame.DataFrame'>"
35+
with pytest.raises(ValueError, match=msg):
36+
df.to_period(axis=2)
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import numpy as np
2+
import pytest
3+
4+
from pandas import DataFrame, Index, MultiIndex, date_range
5+
import pandas._testing as tm
6+
7+
8+
class TestTZConvert:
9+
def test_frame_tz_convert(self):
10+
rng = date_range("1/1/2011", periods=200, freq="D", tz="US/Eastern")
11+
12+
df = DataFrame({"a": 1}, index=rng)
13+
result = df.tz_convert("Europe/Berlin")
14+
expected = DataFrame({"a": 1}, rng.tz_convert("Europe/Berlin"))
15+
assert result.index.tz.zone == "Europe/Berlin"
16+
tm.assert_frame_equal(result, expected)
17+
18+
df = df.T
19+
result = df.tz_convert("Europe/Berlin", axis=1)
20+
assert result.columns.tz.zone == "Europe/Berlin"
21+
tm.assert_frame_equal(result, expected.T)
22+
23+
@pytest.mark.parametrize("fn", ["tz_localize", "tz_convert"])
24+
def test_tz_convert_and_localize(self, fn):
25+
l0 = date_range("20140701", periods=5, freq="D")
26+
l1 = date_range("20140701", periods=5, freq="D")
27+
28+
int_idx = Index(range(5))
29+
30+
if fn == "tz_convert":
31+
l0 = l0.tz_localize("UTC")
32+
l1 = l1.tz_localize("UTC")
33+
34+
for idx in [l0, l1]:
35+
36+
l0_expected = getattr(idx, fn)("US/Pacific")
37+
l1_expected = getattr(idx, fn)("US/Pacific")
38+
39+
df1 = DataFrame(np.ones(5), index=l0)
40+
df1 = getattr(df1, fn)("US/Pacific")
41+
tm.assert_index_equal(df1.index, l0_expected)
42+
43+
# MultiIndex
44+
# GH7846
45+
df2 = DataFrame(np.ones(5), MultiIndex.from_arrays([l0, l1]))
46+
47+
df3 = getattr(df2, fn)("US/Pacific", level=0)
48+
assert not df3.index.levels[0].equals(l0)
49+
tm.assert_index_equal(df3.index.levels[0], l0_expected)
50+
tm.assert_index_equal(df3.index.levels[1], l1)
51+
assert not df3.index.levels[1].equals(l1_expected)
52+
53+
df3 = getattr(df2, fn)("US/Pacific", level=1)
54+
tm.assert_index_equal(df3.index.levels[0], l0)
55+
assert not df3.index.levels[0].equals(l0_expected)
56+
tm.assert_index_equal(df3.index.levels[1], l1_expected)
57+
assert not df3.index.levels[1].equals(l1)
58+
59+
df4 = DataFrame(np.ones(5), MultiIndex.from_arrays([int_idx, l0]))
60+
61+
# TODO: untested
62+
df5 = getattr(df4, fn)("US/Pacific", level=1) # noqa
63+
64+
tm.assert_index_equal(df3.index.levels[0], l0)
65+
assert not df3.index.levels[0].equals(l0_expected)
66+
tm.assert_index_equal(df3.index.levels[1], l1_expected)
67+
assert not df3.index.levels[1].equals(l1)
68+
69+
# Bad Inputs
70+
71+
# Not DatetimeIndex / PeriodIndex
72+
with pytest.raises(TypeError, match="DatetimeIndex"):
73+
df = DataFrame(index=int_idx)
74+
df = getattr(df, fn)("US/Pacific")
75+
76+
# Not DatetimeIndex / PeriodIndex
77+
with pytest.raises(TypeError, match="DatetimeIndex"):
78+
df = DataFrame(np.ones(5), MultiIndex.from_arrays([int_idx, l0]))
79+
df = getattr(df, fn)("US/Pacific", level=0)
80+
81+
# Invalid level
82+
with pytest.raises(ValueError, match="not valid"):
83+
df = DataFrame(index=l0)
84+
df = getattr(df, fn)("US/Pacific", level=1)

0 commit comments

Comments
 (0)