Skip to content

Commit 2227c83

Browse files
authored
REF/TST: method-specific files for Series timeseries methods (#32226)
1 parent 1bcc368 commit 2227c83

11 files changed

+485
-434
lines changed

pandas/tests/series/methods/test_asfreq.py

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
from datetime import datetime
2+
13
import numpy as np
4+
import pytest
25

3-
from pandas import DataFrame, Series, period_range
6+
from pandas import DataFrame, DatetimeIndex, Series, date_range, period_range
47
import pandas._testing as tm
58

9+
from pandas.tseries.offsets import BDay, BMonthEnd
10+
611

712
class TestAsFreq:
813
# TODO: de-duplicate/parametrize or move DataFrame test
@@ -21,3 +26,79 @@ def test_asfreq_ts(self):
2126
result = ts.asfreq("D", how="start")
2227
assert len(result) == len(ts)
2328
tm.assert_index_equal(result.index, index.asfreq("D", how="start"))
29+
30+
@pytest.mark.parametrize("tz", ["US/Eastern", "dateutil/US/Eastern"])
31+
def test_tz_aware_asfreq(self, tz):
32+
dr = date_range("2011-12-01", "2012-07-20", freq="D", tz=tz)
33+
34+
ser = Series(np.random.randn(len(dr)), index=dr)
35+
36+
# it works!
37+
ser.asfreq("T")
38+
39+
def test_asfreq(self):
40+
ts = Series(
41+
[0.0, 1.0, 2.0],
42+
index=[
43+
datetime(2009, 10, 30),
44+
datetime(2009, 11, 30),
45+
datetime(2009, 12, 31),
46+
],
47+
)
48+
49+
daily_ts = ts.asfreq("B")
50+
monthly_ts = daily_ts.asfreq("BM")
51+
tm.assert_series_equal(monthly_ts, ts)
52+
53+
daily_ts = ts.asfreq("B", method="pad")
54+
monthly_ts = daily_ts.asfreq("BM")
55+
tm.assert_series_equal(monthly_ts, ts)
56+
57+
daily_ts = ts.asfreq(BDay())
58+
monthly_ts = daily_ts.asfreq(BMonthEnd())
59+
tm.assert_series_equal(monthly_ts, ts)
60+
61+
result = ts[:0].asfreq("M")
62+
assert len(result) == 0
63+
assert result is not ts
64+
65+
daily_ts = ts.asfreq("D", fill_value=-1)
66+
result = daily_ts.value_counts().sort_index()
67+
expected = Series([60, 1, 1, 1], index=[-1.0, 2.0, 1.0, 0.0]).sort_index()
68+
tm.assert_series_equal(result, expected)
69+
70+
def test_asfreq_datetimeindex_empty_series(self):
71+
# GH#14320
72+
index = DatetimeIndex(["2016-09-29 11:00"])
73+
expected = Series(index=index, dtype=object).asfreq("H")
74+
result = Series([3], index=index.copy()).asfreq("H")
75+
tm.assert_index_equal(expected.index, result.index)
76+
77+
def test_asfreq_keep_index_name(self):
78+
# GH#9854
79+
index_name = "bar"
80+
index = date_range("20130101", periods=20, name=index_name)
81+
df = DataFrame(list(range(20)), columns=["foo"], index=index)
82+
83+
assert index_name == df.index.name
84+
assert index_name == df.asfreq("10D").index.name
85+
86+
def test_asfreq_normalize(self):
87+
rng = date_range("1/1/2000 09:30", periods=20)
88+
norm = date_range("1/1/2000", periods=20)
89+
vals = np.random.randn(20)
90+
ts = Series(vals, index=rng)
91+
92+
result = ts.asfreq("D", normalize=True)
93+
norm = date_range("1/1/2000", periods=20)
94+
expected = Series(vals, index=norm)
95+
96+
tm.assert_series_equal(result, expected)
97+
98+
vals = np.random.randn(20, 3)
99+
ts = DataFrame(vals, index=rng)
100+
101+
result = ts.asfreq("D", normalize=True)
102+
expected = DataFrame(vals, index=norm)
103+
104+
tm.assert_frame_equal(result, expected)
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
from datetime import time
2+
3+
import numpy as np
4+
import pytest
5+
6+
from pandas._libs.tslibs import timezones
7+
8+
from pandas import DataFrame, Series, date_range
9+
import pandas._testing as tm
10+
11+
12+
class TestAtTime:
13+
@pytest.mark.parametrize("tzstr", ["US/Eastern", "dateutil/US/Eastern"])
14+
def test_localized_at_time(self, tzstr):
15+
tz = timezones.maybe_get_tz(tzstr)
16+
17+
rng = date_range("4/16/2012", "5/1/2012", freq="H")
18+
ts = Series(np.random.randn(len(rng)), index=rng)
19+
20+
ts_local = ts.tz_localize(tzstr)
21+
22+
result = ts_local.at_time(time(10, 0))
23+
expected = ts.at_time(time(10, 0)).tz_localize(tzstr)
24+
tm.assert_series_equal(result, expected)
25+
assert timezones.tz_compare(result.index.tz, tz)
26+
27+
def test_at_time(self):
28+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
29+
ts = Series(np.random.randn(len(rng)), index=rng)
30+
rs = ts.at_time(rng[1])
31+
assert (rs.index.hour == rng[1].hour).all()
32+
assert (rs.index.minute == rng[1].minute).all()
33+
assert (rs.index.second == rng[1].second).all()
34+
35+
result = ts.at_time("9:30")
36+
expected = ts.at_time(time(9, 30))
37+
tm.assert_series_equal(result, expected)
38+
39+
df = DataFrame(np.random.randn(len(rng), 3), index=rng)
40+
41+
result = ts[time(9, 30)]
42+
result_df = df.loc[time(9, 30)]
43+
expected = ts[(rng.hour == 9) & (rng.minute == 30)]
44+
exp_df = df[(rng.hour == 9) & (rng.minute == 30)]
45+
46+
tm.assert_series_equal(result, expected)
47+
tm.assert_frame_equal(result_df, exp_df)
48+
49+
chunk = df.loc["1/4/2000":]
50+
result = chunk.loc[time(9, 30)]
51+
expected = result_df[-1:]
52+
tm.assert_frame_equal(result, expected)
53+
54+
# midnight, everything
55+
rng = date_range("1/1/2000", "1/31/2000")
56+
ts = Series(np.random.randn(len(rng)), index=rng)
57+
58+
result = ts.at_time(time(0, 0))
59+
tm.assert_series_equal(result, ts)
60+
61+
# time doesn't exist
62+
rng = date_range("1/1/2012", freq="23Min", periods=384)
63+
ts = Series(np.random.randn(len(rng)), rng)
64+
rs = ts.at_time("16:00")
65+
assert len(rs) == 0
66+
67+
def test_at_time_raises(self):
68+
# GH20725
69+
ser = Series("a b c".split())
70+
msg = "Index must be DatetimeIndex"
71+
with pytest.raises(TypeError, match=msg):
72+
ser.at_time("00:00")
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import numpy as np
2+
3+
from pandas import Series, bdate_range, date_range, period_range
4+
import pandas._testing as tm
5+
6+
7+
class TestBetween:
8+
9+
# TODO: redundant with test_between_datetime_values?
10+
def test_between(self):
11+
series = Series(date_range("1/1/2000", periods=10))
12+
left, right = series[[2, 7]]
13+
14+
result = series.between(left, right)
15+
expected = (series >= left) & (series <= right)
16+
tm.assert_series_equal(result, expected)
17+
18+
def test_between_datetime_values(self):
19+
ser = Series(bdate_range("1/1/2000", periods=20).astype(object))
20+
ser[::2] = np.nan
21+
22+
result = ser[ser.between(ser[3], ser[17])]
23+
expected = ser[3:18].dropna()
24+
tm.assert_series_equal(result, expected)
25+
26+
result = ser[ser.between(ser[3], ser[17], inclusive=False)]
27+
expected = ser[5:16].dropna()
28+
tm.assert_series_equal(result, expected)
29+
30+
def test_between_period_values(self):
31+
ser = Series(period_range("2000-01-01", periods=10, freq="D"))
32+
left, right = ser[[2, 7]]
33+
result = ser.between(left, right)
34+
expected = (ser >= left) & (ser <= right)
35+
tm.assert_series_equal(result, expected)
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
from datetime import datetime, time
2+
from itertools import product
3+
4+
import numpy as np
5+
import pytest
6+
7+
from pandas._libs.tslibs import timezones
8+
import pandas.util._test_decorators as td
9+
10+
from pandas import DataFrame, Series, date_range
11+
import pandas._testing as tm
12+
13+
14+
class TestBetweenTime:
15+
@pytest.mark.parametrize("tzstr", ["US/Eastern", "dateutil/US/Eastern"])
16+
def test_localized_between_time(self, tzstr):
17+
tz = timezones.maybe_get_tz(tzstr)
18+
19+
rng = date_range("4/16/2012", "5/1/2012", freq="H")
20+
ts = Series(np.random.randn(len(rng)), index=rng)
21+
22+
ts_local = ts.tz_localize(tzstr)
23+
24+
t1, t2 = time(10, 0), time(11, 0)
25+
result = ts_local.between_time(t1, t2)
26+
expected = ts.between_time(t1, t2).tz_localize(tzstr)
27+
tm.assert_series_equal(result, expected)
28+
assert timezones.tz_compare(result.index.tz, tz)
29+
30+
def test_between_time(self):
31+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
32+
ts = Series(np.random.randn(len(rng)), index=rng)
33+
stime = time(0, 0)
34+
etime = time(1, 0)
35+
36+
close_open = product([True, False], [True, False])
37+
for inc_start, inc_end in close_open:
38+
filtered = ts.between_time(stime, etime, inc_start, inc_end)
39+
exp_len = 13 * 4 + 1
40+
if not inc_start:
41+
exp_len -= 5
42+
if not inc_end:
43+
exp_len -= 4
44+
45+
assert len(filtered) == exp_len
46+
for rs in filtered.index:
47+
t = rs.time()
48+
if inc_start:
49+
assert t >= stime
50+
else:
51+
assert t > stime
52+
53+
if inc_end:
54+
assert t <= etime
55+
else:
56+
assert t < etime
57+
58+
result = ts.between_time("00:00", "01:00")
59+
expected = ts.between_time(stime, etime)
60+
tm.assert_series_equal(result, expected)
61+
62+
# across midnight
63+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
64+
ts = Series(np.random.randn(len(rng)), index=rng)
65+
stime = time(22, 0)
66+
etime = time(9, 0)
67+
68+
close_open = product([True, False], [True, False])
69+
for inc_start, inc_end in close_open:
70+
filtered = ts.between_time(stime, etime, inc_start, inc_end)
71+
exp_len = (12 * 11 + 1) * 4 + 1
72+
if not inc_start:
73+
exp_len -= 4
74+
if not inc_end:
75+
exp_len -= 4
76+
77+
assert len(filtered) == exp_len
78+
for rs in filtered.index:
79+
t = rs.time()
80+
if inc_start:
81+
assert (t >= stime) or (t <= etime)
82+
else:
83+
assert (t > stime) or (t <= etime)
84+
85+
if inc_end:
86+
assert (t <= etime) or (t >= stime)
87+
else:
88+
assert (t < etime) or (t >= stime)
89+
90+
def test_between_time_raises(self):
91+
# GH20725
92+
ser = Series("a b c".split())
93+
msg = "Index must be DatetimeIndex"
94+
with pytest.raises(TypeError, match=msg):
95+
ser.between_time(start_time="00:00", end_time="12:00")
96+
97+
def test_between_time_types(self):
98+
# GH11818
99+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
100+
msg = r"Cannot convert arg \[datetime\.datetime\(2010, 1, 2, 1, 0\)\] to a time"
101+
with pytest.raises(ValueError, match=msg):
102+
rng.indexer_between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5))
103+
104+
frame = DataFrame({"A": 0}, index=rng)
105+
with pytest.raises(ValueError, match=msg):
106+
frame.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5))
107+
108+
series = Series(0, index=rng)
109+
with pytest.raises(ValueError, match=msg):
110+
series.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5))
111+
112+
@td.skip_if_has_locale
113+
def test_between_time_formats(self):
114+
# GH11818
115+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
116+
ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
117+
118+
strings = [
119+
("2:00", "2:30"),
120+
("0200", "0230"),
121+
("2:00am", "2:30am"),
122+
("0200am", "0230am"),
123+
("2:00:00", "2:30:00"),
124+
("020000", "023000"),
125+
("2:00:00am", "2:30:00am"),
126+
("020000am", "023000am"),
127+
]
128+
expected_length = 28
129+
130+
for time_string in strings:
131+
assert len(ts.between_time(*time_string)) == expected_length
132+
133+
def test_between_time_axis(self):
134+
# issue 8839
135+
rng = date_range("1/1/2000", periods=100, freq="10min")
136+
ts = Series(np.random.randn(len(rng)), index=rng)
137+
stime, etime = ("08:00:00", "09:00:00")
138+
expected_length = 7
139+
140+
assert len(ts.between_time(stime, etime)) == expected_length
141+
assert len(ts.between_time(stime, etime, axis=0)) == expected_length
142+
msg = "No axis named 1 for object type <class 'pandas.core.series.Series'>"
143+
with pytest.raises(ValueError, match=msg):
144+
ts.between_time(stime, etime, axis=1)

pandas/tests/series/methods/test_truncate.py

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

46
import pandas as pd
7+
from pandas import Series, date_range
58
import pandas._testing as tm
69

710
from pandas.tseries.offsets import BDay
@@ -76,3 +79,33 @@ def test_truncate_nonsortedindex(self):
7679

7780
with pytest.raises(ValueError, match=msg):
7881
ts.sort_values(ascending=False).truncate(before="2011-11", after="2011-12")
82+
83+
def test_truncate_datetimeindex_tz(self):
84+
# GH 9243
85+
idx = date_range("4/1/2005", "4/30/2005", freq="D", tz="US/Pacific")
86+
s = Series(range(len(idx)), index=idx)
87+
result = s.truncate(datetime(2005, 4, 2), datetime(2005, 4, 4))
88+
expected = Series([1, 2, 3], index=idx[1:4])
89+
tm.assert_series_equal(result, expected)
90+
91+
def test_truncate_periodindex(self):
92+
# GH 17717
93+
idx1 = pd.PeriodIndex(
94+
[pd.Period("2017-09-02"), pd.Period("2017-09-02"), pd.Period("2017-09-03")]
95+
)
96+
series1 = pd.Series([1, 2, 3], index=idx1)
97+
result1 = series1.truncate(after="2017-09-02")
98+
99+
expected_idx1 = pd.PeriodIndex(
100+
[pd.Period("2017-09-02"), pd.Period("2017-09-02")]
101+
)
102+
tm.assert_series_equal(result1, pd.Series([1, 2], index=expected_idx1))
103+
104+
idx2 = pd.PeriodIndex(
105+
[pd.Period("2017-09-03"), pd.Period("2017-09-02"), pd.Period("2017-09-03")]
106+
)
107+
series2 = pd.Series([1, 2, 3], index=idx2)
108+
result2 = series2.sort_index().truncate(after="2017-09-02")
109+
110+
expected_idx2 = pd.PeriodIndex([pd.Period("2017-09-02")])
111+
tm.assert_series_equal(result2, pd.Series([2], index=expected_idx2))

0 commit comments

Comments
 (0)