Skip to content

Commit 33b2081

Browse files
authored
Merge pull request #64 from pandas-dev/master
Sync Fork from Upstream Repo
2 parents 39d980a + cf993fd commit 33b2081

15 files changed

+1257
-1180
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)

0 commit comments

Comments
 (0)