Skip to content

Commit fa06aeb

Browse files
committed
Merge pull request #9824 from ssanderson/holiday-allow-tz
Allow tz-aware inputs in Holiday.dates
2 parents 5d57aad + 0a216f4 commit fa06aeb

File tree

2 files changed

+111
-75
lines changed

2 files changed

+111
-75
lines changed

pandas/tseries/holiday.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,10 @@ def dates(self, start_date, end_date, return_name=False):
203203
end_date = Timestamp(end_date)
204204

205205
year_offset = DateOffset(years=1)
206-
base_date = Timestamp(datetime(start_date.year, self.month, self.day))
206+
base_date = Timestamp(
207+
datetime(start_date.year, self.month, self.day),
208+
tz=start_date.tz,
209+
)
207210
dates = DatetimeIndex(start=base_date, end=end_date, freq=year_offset)
208211
holiday_dates = self._apply_rule(dates)
209212
if self.days_of_week is not None:

pandas/tseries/tests/test_holiday.py

+107-74
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
HolidayCalendarFactory, next_workday, previous_workday,
1010
before_nearest_workday, EasterMonday, GoodFriday,
1111
after_nearest_workday, weekend_to_monday)
12+
from pytz import utc
1213
import nose
1314

1415
class TestCalendar(tm.TestCase):
@@ -55,87 +56,119 @@ def setUp(self):
5556
self.start_date = datetime(2011, 1, 1)
5657
self.end_date = datetime(2020, 12, 31)
5758

59+
def check_results(self, holiday, start, end, expected):
60+
self.assertEqual(list(holiday.dates(start, end)), expected)
61+
# Verify that timezone info is preserved.
62+
self.assertEqual(
63+
list(
64+
holiday.dates(
65+
utc.localize(Timestamp(start)),
66+
utc.localize(Timestamp(end)),
67+
)
68+
),
69+
[utc.localize(dt) for dt in expected],
70+
)
71+
5872
def test_usmemorialday(self):
59-
holidays = USMemorialDay.dates(self.start_date,
60-
self.end_date)
61-
holidayList = [
62-
datetime(2011, 5, 30),
63-
datetime(2012, 5, 28),
64-
datetime(2013, 5, 27),
65-
datetime(2014, 5, 26),
66-
datetime(2015, 5, 25),
67-
datetime(2016, 5, 30),
68-
datetime(2017, 5, 29),
69-
datetime(2018, 5, 28),
70-
datetime(2019, 5, 27),
71-
datetime(2020, 5, 25),
72-
]
73-
self.assertEqual(list(holidays), holidayList)
73+
self.check_results(
74+
holiday=USMemorialDay,
75+
start=self.start_date,
76+
end=self.end_date,
77+
expected=[
78+
datetime(2011, 5, 30),
79+
datetime(2012, 5, 28),
80+
datetime(2013, 5, 27),
81+
datetime(2014, 5, 26),
82+
datetime(2015, 5, 25),
83+
datetime(2016, 5, 30),
84+
datetime(2017, 5, 29),
85+
datetime(2018, 5, 28),
86+
datetime(2019, 5, 27),
87+
datetime(2020, 5, 25),
88+
],
89+
)
7490

7591
def test_non_observed_holiday(self):
76-
july_3rd = Holiday('July 4th Eve', month=7, day=3)
77-
result = july_3rd.dates("2001-01-01", "2003-03-03")
78-
expected = [Timestamp('2001-07-03 00:00:00'),
79-
Timestamp('2002-07-03 00:00:00')]
80-
self.assertEqual(list(result), expected)
81-
july_3rd = Holiday('July 4th Eve', month=7, day=3,
82-
days_of_week=(0, 1, 2, 3))
83-
result = july_3rd.dates("2001-01-01", "2008-03-03")
84-
expected = [Timestamp('2001-07-03 00:00:00'),
85-
Timestamp('2002-07-03 00:00:00'),
86-
Timestamp('2003-07-03 00:00:00'),
87-
Timestamp('2006-07-03 00:00:00'),
88-
Timestamp('2007-07-03 00:00:00')]
89-
self.assertEqual(list(result), expected)
92+
93+
self.check_results(
94+
Holiday('July 4th Eve', month=7, day=3),
95+
start="2001-01-01",
96+
end="2003-03-03",
97+
expected=[
98+
Timestamp('2001-07-03 00:00:00'),
99+
Timestamp('2002-07-03 00:00:00')
100+
]
101+
)
102+
103+
self.check_results(
104+
Holiday('July 4th Eve', month=7, day=3, days_of_week=(0, 1, 2, 3)),
105+
start="2001-01-01",
106+
end="2008-03-03",
107+
expected=[
108+
Timestamp('2001-07-03 00:00:00'),
109+
Timestamp('2002-07-03 00:00:00'),
110+
Timestamp('2003-07-03 00:00:00'),
111+
Timestamp('2006-07-03 00:00:00'),
112+
Timestamp('2007-07-03 00:00:00'),
113+
]
114+
)
90115

91116
def test_easter(self):
92-
holidays = EasterMonday.dates(self.start_date,
93-
self.end_date)
94-
holidayList = [Timestamp('2011-04-25 00:00:00'),
95-
Timestamp('2012-04-09 00:00:00'),
96-
Timestamp('2013-04-01 00:00:00'),
97-
Timestamp('2014-04-21 00:00:00'),
98-
Timestamp('2015-04-06 00:00:00'),
99-
Timestamp('2016-03-28 00:00:00'),
100-
Timestamp('2017-04-17 00:00:00'),
101-
Timestamp('2018-04-02 00:00:00'),
102-
Timestamp('2019-04-22 00:00:00'),
103-
Timestamp('2020-04-13 00:00:00')]
104-
105-
106-
self.assertEqual(list(holidays), holidayList)
107-
holidays = GoodFriday.dates(self.start_date,
108-
self.end_date)
109-
holidayList = [Timestamp('2011-04-22 00:00:00'),
110-
Timestamp('2012-04-06 00:00:00'),
111-
Timestamp('2013-03-29 00:00:00'),
112-
Timestamp('2014-04-18 00:00:00'),
113-
Timestamp('2015-04-03 00:00:00'),
114-
Timestamp('2016-03-25 00:00:00'),
115-
Timestamp('2017-04-14 00:00:00'),
116-
Timestamp('2018-03-30 00:00:00'),
117-
Timestamp('2019-04-19 00:00:00'),
118-
Timestamp('2020-04-10 00:00:00')]
119-
self.assertEqual(list(holidays), holidayList)
120-
117+
118+
self.check_results(
119+
EasterMonday,
120+
start=self.start_date,
121+
end=self.end_date,
122+
expected=[
123+
Timestamp('2011-04-25 00:00:00'),
124+
Timestamp('2012-04-09 00:00:00'),
125+
Timestamp('2013-04-01 00:00:00'),
126+
Timestamp('2014-04-21 00:00:00'),
127+
Timestamp('2015-04-06 00:00:00'),
128+
Timestamp('2016-03-28 00:00:00'),
129+
Timestamp('2017-04-17 00:00:00'),
130+
Timestamp('2018-04-02 00:00:00'),
131+
Timestamp('2019-04-22 00:00:00'),
132+
Timestamp('2020-04-13 00:00:00'),
133+
],
134+
)
135+
self.check_results(
136+
GoodFriday,
137+
start=self.start_date,
138+
end=self.end_date,
139+
expected=[
140+
Timestamp('2011-04-22 00:00:00'),
141+
Timestamp('2012-04-06 00:00:00'),
142+
Timestamp('2013-03-29 00:00:00'),
143+
Timestamp('2014-04-18 00:00:00'),
144+
Timestamp('2015-04-03 00:00:00'),
145+
Timestamp('2016-03-25 00:00:00'),
146+
Timestamp('2017-04-14 00:00:00'),
147+
Timestamp('2018-03-30 00:00:00'),
148+
Timestamp('2019-04-19 00:00:00'),
149+
Timestamp('2020-04-10 00:00:00'),
150+
],
151+
)
121152

122153
def test_usthanksgivingday(self):
123-
holidays = USThanksgivingDay.dates(self.start_date,
124-
self.end_date)
125-
holidayList = [
126-
datetime(2011, 11, 24),
127-
datetime(2012, 11, 22),
128-
datetime(2013, 11, 28),
129-
datetime(2014, 11, 27),
130-
datetime(2015, 11, 26),
131-
datetime(2016, 11, 24),
132-
datetime(2017, 11, 23),
133-
datetime(2018, 11, 22),
134-
datetime(2019, 11, 28),
135-
datetime(2020, 11, 26),
136-
]
137-
138-
self.assertEqual(list(holidays), holidayList)
154+
155+
self.check_results(
156+
USThanksgivingDay,
157+
start=self.start_date,
158+
end=self.end_date,
159+
expected=[
160+
datetime(2011, 11, 24),
161+
datetime(2012, 11, 22),
162+
datetime(2013, 11, 28),
163+
datetime(2014, 11, 27),
164+
datetime(2015, 11, 26),
165+
datetime(2016, 11, 24),
166+
datetime(2017, 11, 23),
167+
datetime(2018, 11, 22),
168+
datetime(2019, 11, 28),
169+
datetime(2020, 11, 26),
170+
],
171+
)
139172

140173
def test_argument_types(self):
141174
holidays = USThanksgivingDay.dates(self.start_date,

0 commit comments

Comments
 (0)