pandas-market-calendars 5.0.0__py3-none-any.whl → 5.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pandas_market_calendars/__init__.py +39 -39
- pandas_market_calendars/calendar_registry.py +57 -57
- pandas_market_calendars/calendar_utils.py +1151 -1147
- pandas_market_calendars/calendars/asx.py +77 -70
- pandas_market_calendars/calendars/bmf.py +226 -219
- pandas_market_calendars/calendars/bse.py +432 -425
- pandas_market_calendars/calendars/cboe.py +156 -149
- pandas_market_calendars/calendars/cme.py +412 -405
- pandas_market_calendars/calendars/cme_globex_agriculture.py +172 -172
- pandas_market_calendars/calendars/cme_globex_base.py +126 -119
- pandas_market_calendars/calendars/cme_globex_crypto.py +165 -158
- pandas_market_calendars/calendars/cme_globex_energy_and_metals.py +223 -216
- pandas_market_calendars/calendars/cme_globex_equities.py +130 -123
- pandas_market_calendars/calendars/cme_globex_fixed_income.py +136 -136
- pandas_market_calendars/calendars/cme_globex_fx.py +101 -101
- pandas_market_calendars/calendars/eurex.py +138 -131
- pandas_market_calendars/calendars/eurex_fixed_income.py +105 -98
- pandas_market_calendars/calendars/hkex.py +438 -431
- pandas_market_calendars/calendars/ice.py +88 -81
- pandas_market_calendars/calendars/iex.py +162 -155
- pandas_market_calendars/calendars/jpx.py +124 -117
- pandas_market_calendars/calendars/lse.py +125 -118
- pandas_market_calendars/calendars/mirror.py +144 -144
- pandas_market_calendars/calendars/nyse.py +1472 -1466
- pandas_market_calendars/calendars/ose.py +125 -118
- pandas_market_calendars/calendars/sifma.py +390 -356
- pandas_market_calendars/calendars/six.py +143 -136
- pandas_market_calendars/calendars/sse.py +322 -315
- pandas_market_calendars/calendars/tase.py +231 -224
- pandas_market_calendars/calendars/tsx.py +192 -185
- pandas_market_calendars/class_registry.py +115 -115
- pandas_market_calendars/holidays/cme.py +385 -385
- pandas_market_calendars/holidays/cme_globex.py +214 -214
- pandas_market_calendars/holidays/cn.py +1476 -1476
- pandas_market_calendars/holidays/jp.py +401 -401
- pandas_market_calendars/holidays/jpx_equinox.py +506 -506
- pandas_market_calendars/holidays/nyse.py +1536 -1536
- pandas_market_calendars/holidays/oz.py +63 -63
- pandas_market_calendars/holidays/sifma.py +350 -350
- pandas_market_calendars/holidays/us.py +376 -376
- pandas_market_calendars/market_calendar.py +1008 -1008
- {pandas_market_calendars-5.0.0.dist-info → pandas_market_calendars-5.1.1.dist-info}/METADATA +3 -1
- pandas_market_calendars-5.1.1.dist-info/RECORD +50 -0
- {pandas_market_calendars-5.0.0.dist-info → pandas_market_calendars-5.1.1.dist-info}/WHEEL +1 -1
- pandas_market_calendars-5.0.0.dist-info/RECORD +0 -50
- {pandas_market_calendars-5.0.0.dist-info → pandas_market_calendars-5.1.1.dist-info}/licenses/LICENSE +0 -0
- {pandas_market_calendars-5.0.0.dist-info → pandas_market_calendars-5.1.1.dist-info}/licenses/NOTICE +0 -0
- {pandas_market_calendars-5.0.0.dist-info → pandas_market_calendars-5.1.1.dist-info}/top_level.txt +0 -0
@@ -1,315 +1,322 @@
|
|
1
|
-
from datetime import time, timedelta
|
2
|
-
from functools import partial
|
3
|
-
|
4
|
-
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, next_monday
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
""
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
Holiday(
|
61
|
-
name="New Year's Day",
|
62
|
-
month=1,
|
63
|
-
day=
|
64
|
-
observance=
|
65
|
-
start_date=Timestamp(start_year, 1,
|
66
|
-
),
|
67
|
-
Holiday(
|
68
|
-
name="New Year's Day",
|
69
|
-
month=1,
|
70
|
-
day=
|
71
|
-
observance=partial(
|
72
|
-
start_date=Timestamp(start_year, 1,
|
73
|
-
),
|
74
|
-
Holiday(
|
75
|
-
name="
|
76
|
-
month=1,
|
77
|
-
day=
|
78
|
-
observance=partial(
|
79
|
-
start_date=Timestamp(start_year, 1,
|
80
|
-
),
|
81
|
-
Holiday(
|
82
|
-
name="Spring Festival",
|
83
|
-
month=1,
|
84
|
-
day=
|
85
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta
|
86
|
-
start_date=Timestamp(start_year, 1,
|
87
|
-
),
|
88
|
-
Holiday(
|
89
|
-
name="Spring Festival",
|
90
|
-
month=1,
|
91
|
-
day=21,
|
92
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=
|
93
|
-
start_date=Timestamp(start_year, 1,
|
94
|
-
),
|
95
|
-
Holiday(
|
96
|
-
name="Spring Festival",
|
97
|
-
month=1,
|
98
|
-
day=21,
|
99
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=
|
100
|
-
start_date=Timestamp(start_year, 1,
|
101
|
-
),
|
102
|
-
Holiday(
|
103
|
-
name="Spring Festival",
|
104
|
-
month=1,
|
105
|
-
day=21,
|
106
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=
|
107
|
-
start_date=Timestamp(start_year, 1,
|
108
|
-
),
|
109
|
-
Holiday(
|
110
|
-
name="Spring Festival",
|
111
|
-
month=1,
|
112
|
-
day=21,
|
113
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=
|
114
|
-
start_date=Timestamp(start_year, 1,
|
115
|
-
),
|
116
|
-
Holiday(
|
117
|
-
name="Spring Festival",
|
118
|
-
month=1,
|
119
|
-
day=21,
|
120
|
-
observance=partial(lunisolar, mapping=sf_mapping, delta=
|
121
|
-
start_date=Timestamp(start_year, 1,
|
122
|
-
),
|
123
|
-
Holiday(
|
124
|
-
name="
|
125
|
-
month=
|
126
|
-
day=
|
127
|
-
observance=
|
128
|
-
start_date=Timestamp(start_year,
|
129
|
-
),
|
130
|
-
Holiday(
|
131
|
-
name="Labour Day",
|
132
|
-
month=5,
|
133
|
-
day=
|
134
|
-
observance=
|
135
|
-
start_date=Timestamp(start_year, 5,
|
136
|
-
),
|
137
|
-
Holiday(
|
138
|
-
name="Labour Day",
|
139
|
-
month=5,
|
140
|
-
day=
|
141
|
-
observance=
|
142
|
-
start_date=Timestamp(start_year, 5,
|
143
|
-
),
|
144
|
-
Holiday(
|
145
|
-
name="
|
146
|
-
month=
|
147
|
-
day=
|
148
|
-
observance=
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
dow
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
1
|
+
from datetime import time, timedelta
|
2
|
+
from functools import partial
|
3
|
+
|
4
|
+
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, next_monday
|
5
|
+
import sys
|
6
|
+
# check python versiOn aNd import accordingly
|
7
|
+
if sys.version_info >= (3, 9):
|
8
|
+
# For Python 3.9 and later, import directly
|
9
|
+
from zoneinfo import ZoneInfo
|
10
|
+
else:
|
11
|
+
# For Python 3.8 and earlier, import from backports
|
12
|
+
from backports.zoneinfo import ZoneInfo
|
13
|
+
|
14
|
+
from pandas_market_calendars.holidays.cn import *
|
15
|
+
from pandas_market_calendars.market_calendar import MarketCalendar
|
16
|
+
|
17
|
+
|
18
|
+
class SSEExchangeCalendar(MarketCalendar):
|
19
|
+
"""
|
20
|
+
Exchange calendar for Shanghai Stock Exchange
|
21
|
+
|
22
|
+
Open Time: 9:30 AM, Asia/Shanghai
|
23
|
+
LUNCH BREAK :facepalm: : 11:30 AM - 1:00 PM Asia/Shanghai
|
24
|
+
Close Time: 3:00 PM, Asia/Shanghai
|
25
|
+
"""
|
26
|
+
|
27
|
+
aliases = ["SSE"]
|
28
|
+
regular_market_times = {
|
29
|
+
"market_open": ((None, time(9, 30)),),
|
30
|
+
"market_close": ((None, time(15)),),
|
31
|
+
"break_start": ((None, time(11, 30)),),
|
32
|
+
"break_end": ((None, time(13)),),
|
33
|
+
}
|
34
|
+
|
35
|
+
@property
|
36
|
+
def name(self):
|
37
|
+
return "SSE"
|
38
|
+
|
39
|
+
@property
|
40
|
+
def full_name(self):
|
41
|
+
return "Shanghai Stock Exchange"
|
42
|
+
|
43
|
+
@property
|
44
|
+
def tz(self):
|
45
|
+
return ZoneInfo("Asia/Shanghai")
|
46
|
+
|
47
|
+
@property
|
48
|
+
def regular_holidays(self):
|
49
|
+
"""
|
50
|
+
Rules are guesses based on observations of recent year.
|
51
|
+
Rectify accordingly once the next year's holidays arrangement is published by the government.
|
52
|
+
"""
|
53
|
+
# Since all past holidays are adhoc, start_year should always be a year in the future.
|
54
|
+
# For example: Holiday arrangements for 2022 are now included,
|
55
|
+
# then our guesswork starts from the next year so start_year = 2023
|
56
|
+
start_year = 2026
|
57
|
+
|
58
|
+
return AbstractHolidayCalendar(
|
59
|
+
rules=[
|
60
|
+
Holiday(
|
61
|
+
name="New Year's Day",
|
62
|
+
month=1,
|
63
|
+
day=1,
|
64
|
+
observance=next_monday,
|
65
|
+
start_date=Timestamp(start_year, 1, 1),
|
66
|
+
),
|
67
|
+
Holiday(
|
68
|
+
name="New Year's Day",
|
69
|
+
month=1,
|
70
|
+
day=2,
|
71
|
+
observance=partial(second_day_in_lieu),
|
72
|
+
start_date=Timestamp(start_year, 1, 2),
|
73
|
+
),
|
74
|
+
Holiday(
|
75
|
+
name="New Year's Day",
|
76
|
+
month=1,
|
77
|
+
day=3,
|
78
|
+
observance=partial(third_day_in_lieu),
|
79
|
+
start_date=Timestamp(start_year, 1, 3),
|
80
|
+
),
|
81
|
+
Holiday(
|
82
|
+
name="Spring Festival",
|
83
|
+
month=1,
|
84
|
+
day=20,
|
85
|
+
observance=partial(lunisolar, mapping=sf_mapping, delta=-1),
|
86
|
+
start_date=Timestamp(start_year, 1, 20),
|
87
|
+
),
|
88
|
+
Holiday(
|
89
|
+
name="Spring Festival",
|
90
|
+
month=1,
|
91
|
+
day=21,
|
92
|
+
observance=partial(lunisolar, mapping=sf_mapping, delta=0),
|
93
|
+
start_date=Timestamp(start_year, 1, 21),
|
94
|
+
),
|
95
|
+
Holiday(
|
96
|
+
name="Spring Festival",
|
97
|
+
month=1,
|
98
|
+
day=21,
|
99
|
+
observance=partial(lunisolar, mapping=sf_mapping, delta=1),
|
100
|
+
start_date=Timestamp(start_year, 1, 22),
|
101
|
+
),
|
102
|
+
Holiday(
|
103
|
+
name="Spring Festival",
|
104
|
+
month=1,
|
105
|
+
day=21,
|
106
|
+
observance=partial(lunisolar, mapping=sf_mapping, delta=2),
|
107
|
+
start_date=Timestamp(start_year, 1, 23),
|
108
|
+
),
|
109
|
+
Holiday(
|
110
|
+
name="Spring Festival",
|
111
|
+
month=1,
|
112
|
+
day=21,
|
113
|
+
observance=partial(lunisolar, mapping=sf_mapping, delta=3),
|
114
|
+
start_date=Timestamp(start_year, 1, 24),
|
115
|
+
),
|
116
|
+
Holiday(
|
117
|
+
name="Spring Festival",
|
118
|
+
month=1,
|
119
|
+
day=21,
|
120
|
+
observance=partial(lunisolar, mapping=sf_mapping, delta=4),
|
121
|
+
start_date=Timestamp(start_year, 1, 25),
|
122
|
+
),
|
123
|
+
Holiday(
|
124
|
+
name="Spring Festival",
|
125
|
+
month=1,
|
126
|
+
day=21,
|
127
|
+
observance=partial(lunisolar, mapping=sf_mapping, delta=5),
|
128
|
+
start_date=Timestamp(start_year, 1, 26),
|
129
|
+
),
|
130
|
+
Holiday(
|
131
|
+
name="Labour Day",
|
132
|
+
month=5,
|
133
|
+
day=1,
|
134
|
+
observance=next_monday,
|
135
|
+
start_date=Timestamp(start_year, 5, 1),
|
136
|
+
),
|
137
|
+
Holiday(
|
138
|
+
name="Labour Day",
|
139
|
+
month=5,
|
140
|
+
day=2,
|
141
|
+
observance=second_day_in_lieu,
|
142
|
+
start_date=Timestamp(start_year, 5, 2),
|
143
|
+
),
|
144
|
+
Holiday(
|
145
|
+
name="Labour Day",
|
146
|
+
month=5,
|
147
|
+
day=3,
|
148
|
+
observance=third_day_in_lieu,
|
149
|
+
start_date=Timestamp(start_year, 5, 3),
|
150
|
+
),
|
151
|
+
Holiday(
|
152
|
+
name="Tomb-sweeping Day",
|
153
|
+
month=4,
|
154
|
+
day=4,
|
155
|
+
observance=partial(
|
156
|
+
lunisolar, mapping=tsd_mapping, func=next_monday
|
157
|
+
),
|
158
|
+
start_date=Timestamp(start_year, 4, 4),
|
159
|
+
),
|
160
|
+
Holiday(
|
161
|
+
name="Tomb-sweeping Day",
|
162
|
+
month=4,
|
163
|
+
day=5,
|
164
|
+
observance=partial(
|
165
|
+
lunisolar, mapping=tsd_mapping, func=second_day_in_lieu, delta=1
|
166
|
+
),
|
167
|
+
start_date=Timestamp(start_year, 4, 4),
|
168
|
+
),
|
169
|
+
Holiday(
|
170
|
+
name="Tomb-sweeping Day",
|
171
|
+
month=4,
|
172
|
+
day=6,
|
173
|
+
observance=partial(
|
174
|
+
lunisolar, mapping=tsd_mapping, func=third_day_in_lieu, delta=2
|
175
|
+
),
|
176
|
+
start_date=Timestamp(start_year, 4, 4),
|
177
|
+
),
|
178
|
+
Holiday(
|
179
|
+
name="Dragon Boat Festival",
|
180
|
+
month=5,
|
181
|
+
day=27,
|
182
|
+
observance=partial(
|
183
|
+
lunisolar, mapping=dbf_mapping, func=next_monday
|
184
|
+
),
|
185
|
+
start_date=Timestamp(start_year, 5, 27),
|
186
|
+
),
|
187
|
+
Holiday(
|
188
|
+
name="Dragon Boat Festival",
|
189
|
+
month=5,
|
190
|
+
day=28,
|
191
|
+
observance=partial(
|
192
|
+
lunisolar, mapping=dbf_mapping, func=second_day_in_lieu, delta=1
|
193
|
+
),
|
194
|
+
start_date=Timestamp(start_year, 5, 27),
|
195
|
+
),
|
196
|
+
Holiday(
|
197
|
+
name="Dragon Boat Festival",
|
198
|
+
month=5,
|
199
|
+
day=29,
|
200
|
+
observance=partial(
|
201
|
+
lunisolar, mapping=dbf_mapping, func=third_day_in_lieu, delta=2
|
202
|
+
),
|
203
|
+
start_date=Timestamp(start_year, 5, 27),
|
204
|
+
),
|
205
|
+
Holiday(
|
206
|
+
name="Mid-autumn Festival",
|
207
|
+
month=9,
|
208
|
+
day=7,
|
209
|
+
observance=partial(
|
210
|
+
lunisolar, mapping=maf_mapping, func=next_monday
|
211
|
+
),
|
212
|
+
start_date=Timestamp(start_year, 9, 7),
|
213
|
+
),
|
214
|
+
Holiday(
|
215
|
+
name="Mid-autumn Festival",
|
216
|
+
month=9,
|
217
|
+
day=8,
|
218
|
+
observance=partial(
|
219
|
+
lunisolar, mapping=maf_mapping, func=second_day_in_lieu, delta=1
|
220
|
+
),
|
221
|
+
start_date=Timestamp(start_year, 9, 7),
|
222
|
+
),
|
223
|
+
Holiday(
|
224
|
+
name="Mid-autumn Festival",
|
225
|
+
month=9,
|
226
|
+
day=9,
|
227
|
+
observance=partial(
|
228
|
+
lunisolar, mapping=maf_mapping, func=third_day_in_lieu, delta=2
|
229
|
+
),
|
230
|
+
start_date=Timestamp(start_year, 9, 7),
|
231
|
+
),
|
232
|
+
Holiday(
|
233
|
+
name="National Day",
|
234
|
+
month=10,
|
235
|
+
day=1,
|
236
|
+
start_date=Timestamp(start_year, 10, 1),
|
237
|
+
),
|
238
|
+
Holiday(
|
239
|
+
name="National Day",
|
240
|
+
month=10,
|
241
|
+
day=2,
|
242
|
+
start_date=Timestamp(start_year, 10, 2),
|
243
|
+
),
|
244
|
+
Holiday(
|
245
|
+
name="National Day",
|
246
|
+
month=10,
|
247
|
+
day=3,
|
248
|
+
start_date=Timestamp(start_year, 10, 3),
|
249
|
+
),
|
250
|
+
Holiday(
|
251
|
+
name="National Day",
|
252
|
+
month=10,
|
253
|
+
day=4,
|
254
|
+
start_date=Timestamp(start_year, 10, 4),
|
255
|
+
),
|
256
|
+
Holiday(
|
257
|
+
name="National Day",
|
258
|
+
month=10,
|
259
|
+
day=5,
|
260
|
+
start_date=Timestamp(start_year, 10, 5),
|
261
|
+
),
|
262
|
+
Holiday(
|
263
|
+
name="National Day",
|
264
|
+
month=10,
|
265
|
+
day=6,
|
266
|
+
start_date=Timestamp(start_year, 10, 6),
|
267
|
+
),
|
268
|
+
Holiday(
|
269
|
+
name="National Day",
|
270
|
+
month=10,
|
271
|
+
day=7,
|
272
|
+
start_date=Timestamp(start_year, 10, 7),
|
273
|
+
),
|
274
|
+
]
|
275
|
+
)
|
276
|
+
|
277
|
+
@property
|
278
|
+
def adhoc_holidays(self):
|
279
|
+
return all_holidays
|
280
|
+
|
281
|
+
|
282
|
+
def second_day_in_lieu(dt):
|
283
|
+
dow = dt.weekday()
|
284
|
+
if dow == 0: # Holiday is Sunday, use Saturday
|
285
|
+
return dt - timedelta(2)
|
286
|
+
elif dow == 1: # Holiday is Monday, use Saturday
|
287
|
+
return dt - timedelta(3)
|
288
|
+
elif dow == 2: # Holiday is Tuesday, use Sunday
|
289
|
+
return dt - timedelta(3)
|
290
|
+
elif dow == 3: # Holiday is Wednesday, use Saturday
|
291
|
+
return dt - timedelta(5)
|
292
|
+
|
293
|
+
return dt
|
294
|
+
|
295
|
+
|
296
|
+
def third_day_in_lieu(dt):
|
297
|
+
dow = dt.weekday()
|
298
|
+
if dow == 0: # Holiday is Saturday, use Sunday
|
299
|
+
return dt - timedelta(1)
|
300
|
+
elif dow == 1: # Holiday is Sunday, use Sunday
|
301
|
+
return dt - timedelta(2)
|
302
|
+
elif dow == 2: # Holiday is Monday, use Sunday
|
303
|
+
return dt - timedelta(3)
|
304
|
+
elif dow == 3: # Holiday is Tuesday, use Monday
|
305
|
+
return dt - timedelta(3)
|
306
|
+
elif dow == 4: # Holiday is Wednesday, use Sunday
|
307
|
+
return dt - timedelta(5)
|
308
|
+
|
309
|
+
return dt
|
310
|
+
|
311
|
+
|
312
|
+
def lunisolar(dt, mapping, func=None, delta=None):
|
313
|
+
if mapping and (dt.year in mapping):
|
314
|
+
new_dt = mapping[dt.year]
|
315
|
+
else:
|
316
|
+
new_dt = dt
|
317
|
+
if delta:
|
318
|
+
new_dt = new_dt + timedelta(delta)
|
319
|
+
if func:
|
320
|
+
return func(new_dt)
|
321
|
+
else:
|
322
|
+
return new_dt
|