我正在进行子类化datetime.datetime类,试图添加一些基于日历的操作。特别是,我希望能够在调整周末和银行假日的同时,从锚定日期添加/减去天/周/月/年。
这是一个应该涵盖该方法的片段:
import datetime
import dateutil
class DateTime(datetime.datetime):
def add_workdays(cls, n = 1):
x = 1
while x <= n:
cls += dateutil.relativedelta.relativedelta(days=1)
if cls.weekday() > 4:
x = x
else:
x += 1
return DateTime(cls.year, cls.month, cls.day, cls.hour, cls.minute,
cls.second, cls.microsecond)
此方法通常会在当前日期添加n个工作日(仅限周末)并返回结果。
为了实现银行假期更正,我可以轻松地将包含银行假期的数组(通过setter方法或通过覆盖__new__
方法)传递给方法并进行相应调整。但是,在考虑例如时间序列数据时会出现问题。在这种情况下,每个日期时间对象都将包含所述数组的副本,我怀疑,这可能会使长时间序列数据的内存使用量非常高。
所以我的问题是:复杂的Python程序员将如何处理这个问题?我一直在研究bizdays套餐实现这一目标的方式,但它似乎也遭受了同样的缺点和#34;。
在其他语言中,我本来可以简单地指向假日数组的单个实例,但是对于我(通常是稀疏的)Python知识,这是不可能的。将日期存储为字符串并仅在需要时转换为DateTime是否更为正确?
答案 0 :(得分:3)
您只需在类定义中添加一个变量:
import datetime
class DateTime(datetime.datetime):
holidays = [datetime.date(2017, 7, 4), datetime.date(2017,12,25)] # ....
print(DateTime.holidays)
# [datetime.date(2017, 7, 4), datetime.date(2017, 12, 25)]
它随处可用,包括在任何DateTime
实例中。所有实例只有一个副本:
import datetime
class DateTime(datetime.datetime):
holidays = [datetime.date(2017, 7, 4), datetime.date(2017,12,25)] # ....
def test_only_one_copy_of_holidays(self): # Only defined for testing purposes
return DateTime.holidays
holidays1 = DateTime(2017,7,21).test_only_one_copy_of_holidays()
holidays2 = DateTime(2017,7,30).test_only_one_copy_of_holidays()
print(holidays1 is holidays2) # Are they the same object?
# True
对于多个国家/地区,您可以dict
使用list
s:
>>> import datetime
>>> holidays = {'France': [datetime.date(2017,7,14), datetime.date(2017,12,25)], 'USA': [datetime.date(2017,7,4), datetime.date(2017,12,25)]}
>>> holidays['USA']
[datetime.date(2017, 7, 4), datetime.date(2017, 12, 25)]