我正在对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__
方法)传递给该方法并进行相应的调整。然而,当考虑到时间序列数据时,问题就会发生.在这种情况下,每个datetime对象将包含所述数组的副本,我怀疑这会使内存在长时间序列数据中的使用率相当高。
所以我的问题是:复杂的Python程序员将如何处理这个问题?我一直在研究双日包实现这一点的方式,但它似乎也有同样的“缺点”。
在其他语言中,我本可以简单地指向假日数组的单个实例,但我(诚然是稀疏的) Python知识,这是不可能的。仅仅在需要时将日期存储为字符串并转换为DateTime更正确吗?
发布于 2017-07-21 00:09:38
您可以简单地在类定义中添加一个变量:
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
of 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)]
https://stackoverflow.com/questions/45232216
复制相似问题