Pandas 假期套餐黑色星期五抵消
Pandas Holiday Package Black Friday Offset
我正在使用 holidays 包来构建我的日历假期的日历,并且我对 "Black Friday"(美国感恩节后的一天。始终是星期五)进行了调整,并具有相对增量11 月的第 4 周,适用于 2018 年和 2020 年,但今年将是 11 月的第 5 周,这会使我的设置无效
有没有更好的方法来保证这个值总是落在感恩节后的周五?我不确定是否最好使用假期的假期包列表并使用一些 pandas 魔法根据这些值进行偏移并设置假期,或者是否有更好的日期操作方法来实现这一点。
这是我的方法:
self.append({datetime.date(datetime(year, 11, 1) + relativedelta(weekday=FR(+4))) : "Black Friday"}) # Adding Black Friday
完整代码如下:
import pandas as pd
import numpy as np
import calendar as cal
from datetime import *
from dateutil.relativedelta import *
import holidays
class CorporateHolidays(holidays.UnitedStates):
def _populate(self, year):
print(self)
# Populate the holiday list with the default US holidays
holidays.UnitedStates._populate(self, year)
# Remove Holiday Date(s)
self.pop(datetime.date(datetime(year, 10, 1) + relativedelta(weekday=MO(+2))), None) # Removing Columbus Day
# Add Holiday Date(s)
self.append({datetime.date(datetime(year, 12, 24)) : "Christmas Eve"})
self.append({datetime.date(datetime(year, 12, 31)) : "New Years Eve"})
self.append({datetime.date(datetime(year, 11, 1) + relativedelta(weekday=FR(+4))) : "Black Friday"}) # Adding Black Friday
其中 print(self)
呈现这样的列表:
{datetime.date(2018, 1, 1): "New Year's Day", datetime.date(2018, 1, 15): 'Martin Luther King, Jr. Day', datetime.date(2018, 2, 19): "Washington's Birthday", datetime.date(2018, 5, 28): 'Memorial Day', datetime.date(2018, 7, 4): 'Independence Day', datetime.date(2018, 9, 3): 'Labor Day', datetime.date(2018, 11, 11): 'Veterans Day', datetime.date(2018, 11, 12): 'Veterans Day (Observed)', datetime.date(2018, 11, 22): 'Thanksgiving', datetime.date(2018, 12, 25): 'Christmas Day', datetime.date(2018, 12, 24): 'Christmas Eve', datetime.date(2018, 12, 31): 'New Years Eve', datetime.date(2018, 11, 23): 'Black Friday'}....
感恩节(根据维基百科)始终是 11 月的第四个星期四。如果这个月从星期五开始,这会给您带来麻烦。因此,与其使用第四个星期五,不如尝试使用第四个星期四,并添加最后一天使其成为星期五。像
datetime.date(datetime(year, 11, 1) + relativedelta(weekday=TH(+4)) + timedelta(days=1))
In [5]: datetime.date(datetime(2018, 11, 1) + relativedelta(weekday=TH(+4)) + timedelta(days=1))
Out[5]: datetime.date(2018, 11, 23)
In [6]: datetime.date(datetime(2019, 11, 1) + relativedelta(weekday=TH(+4)) + timedelta(days=1))
Out[6]: datetime.date(2019, 11, 29)
应该可以解决问题
我正在使用 holidays 包来构建我的日历假期的日历,并且我对 "Black Friday"(美国感恩节后的一天。始终是星期五)进行了调整,并具有相对增量11 月的第 4 周,适用于 2018 年和 2020 年,但今年将是 11 月的第 5 周,这会使我的设置无效
有没有更好的方法来保证这个值总是落在感恩节后的周五?我不确定是否最好使用假期的假期包列表并使用一些 pandas 魔法根据这些值进行偏移并设置假期,或者是否有更好的日期操作方法来实现这一点。
这是我的方法:
self.append({datetime.date(datetime(year, 11, 1) + relativedelta(weekday=FR(+4))) : "Black Friday"}) # Adding Black Friday
完整代码如下:
import pandas as pd
import numpy as np
import calendar as cal
from datetime import *
from dateutil.relativedelta import *
import holidays
class CorporateHolidays(holidays.UnitedStates):
def _populate(self, year):
print(self)
# Populate the holiday list with the default US holidays
holidays.UnitedStates._populate(self, year)
# Remove Holiday Date(s)
self.pop(datetime.date(datetime(year, 10, 1) + relativedelta(weekday=MO(+2))), None) # Removing Columbus Day
# Add Holiday Date(s)
self.append({datetime.date(datetime(year, 12, 24)) : "Christmas Eve"})
self.append({datetime.date(datetime(year, 12, 31)) : "New Years Eve"})
self.append({datetime.date(datetime(year, 11, 1) + relativedelta(weekday=FR(+4))) : "Black Friday"}) # Adding Black Friday
其中 print(self)
呈现这样的列表:
{datetime.date(2018, 1, 1): "New Year's Day", datetime.date(2018, 1, 15): 'Martin Luther King, Jr. Day', datetime.date(2018, 2, 19): "Washington's Birthday", datetime.date(2018, 5, 28): 'Memorial Day', datetime.date(2018, 7, 4): 'Independence Day', datetime.date(2018, 9, 3): 'Labor Day', datetime.date(2018, 11, 11): 'Veterans Day', datetime.date(2018, 11, 12): 'Veterans Day (Observed)', datetime.date(2018, 11, 22): 'Thanksgiving', datetime.date(2018, 12, 25): 'Christmas Day', datetime.date(2018, 12, 24): 'Christmas Eve', datetime.date(2018, 12, 31): 'New Years Eve', datetime.date(2018, 11, 23): 'Black Friday'}....
感恩节(根据维基百科)始终是 11 月的第四个星期四。如果这个月从星期五开始,这会给您带来麻烦。因此,与其使用第四个星期五,不如尝试使用第四个星期四,并添加最后一天使其成为星期五。像
datetime.date(datetime(year, 11, 1) + relativedelta(weekday=TH(+4)) + timedelta(days=1))
In [5]: datetime.date(datetime(2018, 11, 1) + relativedelta(weekday=TH(+4)) + timedelta(days=1))
Out[5]: datetime.date(2018, 11, 23)
In [6]: datetime.date(datetime(2019, 11, 1) + relativedelta(weekday=TH(+4)) + timedelta(days=1))
Out[6]: datetime.date(2019, 11, 29)
应该可以解决问题