1import numpy as np
2import pytest
3
4import pandas as pd
5from pandas import PeriodIndex, Series
6import pandas._testing as tm
7
8
9def test_to_native_types():
10    index = PeriodIndex(["2017-01-01", "2017-01-02", "2017-01-03"], freq="D")
11
12    # First, with no arguments.
13    expected = np.array(["2017-01-01", "2017-01-02", "2017-01-03"], dtype="=U10")
14
15    result = index._format_native_types()
16    tm.assert_numpy_array_equal(result, expected)
17
18    # No NaN values, so na_rep has no effect
19    result = index._format_native_types(na_rep="pandas")
20    tm.assert_numpy_array_equal(result, expected)
21
22    # Make sure date formatting works
23    expected = np.array(["01-2017-01", "01-2017-02", "01-2017-03"], dtype="=U10")
24
25    result = index._format_native_types(date_format="%m-%Y-%d")
26    tm.assert_numpy_array_equal(result, expected)
27
28    # NULL object handling should work
29    index = PeriodIndex(["2017-01-01", pd.NaT, "2017-01-03"], freq="D")
30    expected = np.array(["2017-01-01", "NaT", "2017-01-03"], dtype=object)
31
32    result = index._format_native_types()
33    tm.assert_numpy_array_equal(result, expected)
34
35    expected = np.array(["2017-01-01", "pandas", "2017-01-03"], dtype=object)
36
37    result = index._format_native_types(na_rep="pandas")
38    tm.assert_numpy_array_equal(result, expected)
39
40
41class TestPeriodIndexRendering:
42    def test_frame_repr(self):
43        df = pd.DataFrame({"A": [1, 2, 3]}, index=pd.date_range("2000", periods=3))
44        result = repr(df)
45        expected = "            A\n2000-01-01  1\n2000-01-02  2\n2000-01-03  3"
46        assert result == expected
47
48    @pytest.mark.parametrize("method", ["__repr__", "__str__"])
49    def test_representation(self, method):
50        # GH#7601
51        idx1 = PeriodIndex([], freq="D")
52        idx2 = PeriodIndex(["2011-01-01"], freq="D")
53        idx3 = PeriodIndex(["2011-01-01", "2011-01-02"], freq="D")
54        idx4 = PeriodIndex(["2011-01-01", "2011-01-02", "2011-01-03"], freq="D")
55        idx5 = PeriodIndex(["2011", "2012", "2013"], freq="A")
56        idx6 = PeriodIndex(["2011-01-01 09:00", "2012-02-01 10:00", "NaT"], freq="H")
57        idx7 = pd.period_range("2013Q1", periods=1, freq="Q")
58        idx8 = pd.period_range("2013Q1", periods=2, freq="Q")
59        idx9 = pd.period_range("2013Q1", periods=3, freq="Q")
60        idx10 = PeriodIndex(["2011-01-01", "2011-02-01"], freq="3D")
61
62        exp1 = "PeriodIndex([], dtype='period[D]', freq='D')"
63
64        exp2 = "PeriodIndex(['2011-01-01'], dtype='period[D]', freq='D')"
65
66        exp3 = "PeriodIndex(['2011-01-01', '2011-01-02'], dtype='period[D]', freq='D')"
67
68        exp4 = (
69            "PeriodIndex(['2011-01-01', '2011-01-02', '2011-01-03'], "
70            "dtype='period[D]', freq='D')"
71        )
72
73        exp5 = (
74            "PeriodIndex(['2011', '2012', '2013'], dtype='period[A-DEC]', "
75            "freq='A-DEC')"
76        )
77
78        exp6 = (
79            "PeriodIndex(['2011-01-01 09:00', '2012-02-01 10:00', 'NaT'], "
80            "dtype='period[H]', freq='H')"
81        )
82
83        exp7 = "PeriodIndex(['2013Q1'], dtype='period[Q-DEC]', freq='Q-DEC')"
84
85        exp8 = "PeriodIndex(['2013Q1', '2013Q2'], dtype='period[Q-DEC]', freq='Q-DEC')"
86
87        exp9 = (
88            "PeriodIndex(['2013Q1', '2013Q2', '2013Q3'], "
89            "dtype='period[Q-DEC]', freq='Q-DEC')"
90        )
91
92        exp10 = (
93            "PeriodIndex(['2011-01-01', '2011-02-01'], "
94            "dtype='period[3D]', freq='3D')"
95        )
96
97        for idx, expected in zip(
98            [idx1, idx2, idx3, idx4, idx5, idx6, idx7, idx8, idx9, idx10],
99            [exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8, exp9, exp10],
100        ):
101            result = getattr(idx, method)()
102            assert result == expected
103
104    def test_representation_to_series(self):
105        # GH#10971
106        idx1 = PeriodIndex([], freq="D")
107        idx2 = PeriodIndex(["2011-01-01"], freq="D")
108        idx3 = PeriodIndex(["2011-01-01", "2011-01-02"], freq="D")
109        idx4 = PeriodIndex(["2011-01-01", "2011-01-02", "2011-01-03"], freq="D")
110        idx5 = PeriodIndex(["2011", "2012", "2013"], freq="A")
111        idx6 = PeriodIndex(["2011-01-01 09:00", "2012-02-01 10:00", "NaT"], freq="H")
112
113        idx7 = pd.period_range("2013Q1", periods=1, freq="Q")
114        idx8 = pd.period_range("2013Q1", periods=2, freq="Q")
115        idx9 = pd.period_range("2013Q1", periods=3, freq="Q")
116
117        exp1 = """Series([], dtype: period[D])"""
118
119        exp2 = """0    2011-01-01
120dtype: period[D]"""
121
122        exp3 = """0    2011-01-01
1231    2011-01-02
124dtype: period[D]"""
125
126        exp4 = """0    2011-01-01
1271    2011-01-02
1282    2011-01-03
129dtype: period[D]"""
130
131        exp5 = """0    2011
1321    2012
1332    2013
134dtype: period[A-DEC]"""
135
136        exp6 = """0    2011-01-01 09:00
1371    2012-02-01 10:00
1382                 NaT
139dtype: period[H]"""
140
141        exp7 = """0    2013Q1
142dtype: period[Q-DEC]"""
143
144        exp8 = """0    2013Q1
1451    2013Q2
146dtype: period[Q-DEC]"""
147
148        exp9 = """0    2013Q1
1491    2013Q2
1502    2013Q3
151dtype: period[Q-DEC]"""
152
153        for idx, expected in zip(
154            [idx1, idx2, idx3, idx4, idx5, idx6, idx7, idx8, idx9],
155            [exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8, exp9],
156        ):
157            result = repr(Series(idx))
158            assert result == expected
159
160    def test_summary(self):
161        # GH#9116
162        idx1 = PeriodIndex([], freq="D")
163        idx2 = PeriodIndex(["2011-01-01"], freq="D")
164        idx3 = PeriodIndex(["2011-01-01", "2011-01-02"], freq="D")
165        idx4 = PeriodIndex(["2011-01-01", "2011-01-02", "2011-01-03"], freq="D")
166        idx5 = PeriodIndex(["2011", "2012", "2013"], freq="A")
167        idx6 = PeriodIndex(["2011-01-01 09:00", "2012-02-01 10:00", "NaT"], freq="H")
168
169        idx7 = pd.period_range("2013Q1", periods=1, freq="Q")
170        idx8 = pd.period_range("2013Q1", periods=2, freq="Q")
171        idx9 = pd.period_range("2013Q1", periods=3, freq="Q")
172
173        exp1 = """PeriodIndex: 0 entries
174Freq: D"""
175
176        exp2 = """PeriodIndex: 1 entries, 2011-01-01 to 2011-01-01
177Freq: D"""
178
179        exp3 = """PeriodIndex: 2 entries, 2011-01-01 to 2011-01-02
180Freq: D"""
181
182        exp4 = """PeriodIndex: 3 entries, 2011-01-01 to 2011-01-03
183Freq: D"""
184
185        exp5 = """PeriodIndex: 3 entries, 2011 to 2013
186Freq: A-DEC"""
187
188        exp6 = """PeriodIndex: 3 entries, 2011-01-01 09:00 to NaT
189Freq: H"""
190
191        exp7 = """PeriodIndex: 1 entries, 2013Q1 to 2013Q1
192Freq: Q-DEC"""
193
194        exp8 = """PeriodIndex: 2 entries, 2013Q1 to 2013Q2
195Freq: Q-DEC"""
196
197        exp9 = """PeriodIndex: 3 entries, 2013Q1 to 2013Q3
198Freq: Q-DEC"""
199
200        for idx, expected in zip(
201            [idx1, idx2, idx3, idx4, idx5, idx6, idx7, idx8, idx9],
202            [exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8, exp9],
203        ):
204            result = idx._summary()
205            assert result == expected
206