看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
假期和日历提供了一种简单的方法来定义要与 CustomBusinessDay 一起使用的假期规则,或用于需要预定义假期集的其他分析中。
AbstractHolidayCalendar 类提供了返回假日列表的所有必要方法,并且仅需要在特定的假日日历类中定义规则。 此外,start_date 和 end_date 类属性确定在哪个日期范围内生成假日。 这些应该重写为AbstractHolidayCalendar 类,以使范围适用于所有日历子类。 USFederalHolidayCalendar 是唯一存在的日历,主要用作开发其他日历的示例。
对于在固定日期(例如,美国阵亡将士纪念日或7月4日)发生的假日,遵守规则将确定该假日是在周末还是其他未观察到的日子进行观察。 定义的遵守规则是:
规则 | 说明 |
---|---|
nearest_workday | 把星期六移至星期五,星期日移至星期一 |
sunday_to_monday | 星期六紧接着星期一 |
next_monday_or_tuesday | 把星期六移至星期一,并把星期日/星期一移至星期二 |
previous_friday | 把星期六与星期日移至上一个星期五 |
next_monday | 把星期六与星期日移至下一个星期一 |
以下示例定义一个美国的部分自定义节假日:
import datetime
from pandas.tseries.holiday import Holiday, USMemorialDay, \
AbstractHolidayCalendar, nearest_workday, MO
# 定义一个节假日日历的子类
class ExampleCalendar(AbstractHolidayCalendar):
rules = [
USMemorialDay, # 美国纪念日
# 独立日,取最近的工作日(上文规则)
Holiday('July 4th', month=7, day=4, observance=nearest_workday),
# 哥伦布纪念日(十月第二个星期一)
Holiday('Columbus Day', month=10, day=1,
offset=pd.DateOffset(weekday=MO(2)))]
cal = ExampleCalendar()
# 取出2012的节假日
cal.holidays(datetime.datetime(2012, 1, 1), datetime.datetime(2012, 12, 31))
# DatetimeIndex(['2012-05-28', '2012-07-04', '2012-10-08'], dtype='datetime64[ns]', freq=None)
其中 weekday=MO(2)
相当于 2 * Week(weekday=2)
。
我们可以使用上边定义的节假日日历作为频率,遇到正常工作日和这些节假日会跳过:
# 使用日历作为频率
pd.date_range(start='7/1/2012', end='7/10/2012',
freq=pd.offsets.CDay(calendar=cal)).to_pydatetime()
'''
array([datetime.datetime(2012, 7, 2, 0, 0),
datetime.datetime(2012, 7, 3, 0, 0),
datetime.datetime(2012, 7, 5, 0, 0),
datetime.datetime(2012, 7, 6, 0, 0),
datetime.datetime(2012, 7, 9, 0, 0),
datetime.datetime(2012, 7, 10, 0, 0)], dtype=object)
'''
# 按日历规则偏移
offset = pd.offsets.CustomBusinessDay(calendar=cal)
datetime.datetime(2012, 5, 25) + offset
# Timestamp('2012-05-29 00:00:00')
# 按日历规则偏移
datetime.datetime(2012, 7, 3) + offset
# Timestamp('2012-07-05 00:00:00')
datetime.datetime(2012, 7, 3) + 2 * offset
# Timestamp('2012-07-06 00:00:00')
datetime.datetime(2012, 7, 6) + offset
# Timestamp('2012-07-09 00:00:00')
AbstractHolidayCalendar
类可使用的最大最小值及修改方法:
# 查看
AbstractHolidayCalendar.start_date
# Timestamp('1970-01-01 00:00:00')
AbstractHolidayCalendar.end_date
# Timestamp('2200-12-31 00:00:00')
# 修改
AbstractHolidayCalendar.start_date = datetime.datetime(2012, 1, 1)
AbstractHolidayCalendar.end_date = datetime.datetime(2012, 12, 31)
cal.holidays()
# DatetimeIndex(['2012-05-28', '2012-07-04', '2012-10-08'], dtype='datetime64[ns]', freq=None)
以下是访问日历,查看日历规则,附加多日历规则的方法:
from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory,\
USLaborDay
cal = get_calendar('ExampleCalendar')
# 查看日历规则
cal.rules
'''
[Holiday: Memorial Day (month=5, day=31, offset=<DateOffset: weekday=MO(-1)>),
Holiday: July 4th (month=7, day=4, observance=<function nearest_workday at 0x7f8f801d1940>),
Holiday: Columbus Day (month=10, day=1, offset=<DateOffset: weekday=MO(+2)>)]
'''
# 附加规则
new_cal = HolidayCalendarFactory('NewExampleCalendar', cal, USLaborDay)
new_cal.rules
'''
[Holiday: Labor Day (month=9, day=1, offset=<DateOffset: weekday=MO(+1)>),
Holiday: Memorial Day (month=5, day=31, offset=<DateOffset: weekday=MO(-1)>),
Holiday: July 4th (month=7, day=4, observance=<function nearest_workday at 0x7f65445f1830>),
Holiday: Columbus Day (month=10, day=1, offset=<DateOffset: weekday=MO(+2)>)]
'''
更新时间:2020-06-13 18:26:01 标签:pandas 日历